Browse code

Add kubernetes 1.12 spec with VCP patch

Change-Id: Icf7cd385a0e46831f2e29c2aa3eeecc6411ac36b
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6605
Reviewed-by: Anish Swaminathan <anishs@vmware.com>
Tested-by: Anish Swaminathan <anishs@vmware.com>

sudhir samrit authored on 2019/01/23 15:23:05
Showing 2 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,11122 @@
0
+From 4e97404495b08cdfebeb46c766908f074130ba69 Mon Sep 17 00:00:00 2001
1
+From: ssamrit <ssamrit@vmware.com>
2
+Date: Mon, 21 Jan 2019 15:25:41 +0530
3
+Subject: [PATCH] VCP patch for K8s v1.12.3
4
+
5
+---
6
+ api/api-rules/violation_exceptions.list            |    2 +
7
+ api/swagger-spec/apps_v1alpha1.json                |   21 +
8
+ api/swagger-spec/apps_v1beta1.json                 |   21 +
9
+ api/swagger-spec/apps_v1beta2.json                 |   21 +
10
+ api/swagger-spec/batch_v1.json                     |   21 +
11
+ api/swagger-spec/batch_v1beta1.json                |   21 +
12
+ api/swagger-spec/batch_v2alpha1.json               |   21 +
13
+ api/swagger-spec/extensions_v1beta1.json           |   22 +
14
+ api/swagger-spec/settings.k8s.io_v1alpha1.json     |   21 +
15
+ api/swagger-spec/v1.json                           |   25 +
16
+ cmd/kube-controller-manager/app/BUILD              |    1 +
17
+ cmd/kube-controller-manager/app/plugins.go         |    4 +
18
+ cmd/kubelet/app/BUILD                              |    1 +
19
+ cmd/kubelet/app/plugins.go                         |    2 +
20
+ pkg/apis/core/types.go                             |   14 +
21
+ pkg/apis/core/validation/validation.go             |   25 +
22
+ pkg/apis/policy/types.go                           |    1 +
23
+ pkg/cloudprovider/providers/BUILD                  |    2 +
24
+ pkg/cloudprovider/providers/cascade/BUILD          |   56 +
25
+ pkg/cloudprovider/providers/cascade/OWNERS         |    3 +
26
+ pkg/cloudprovider/providers/cascade/apitypes.go    |  230 ++
27
+ pkg/cloudprovider/providers/cascade/auth.go        |  145 ++
28
+ pkg/cloudprovider/providers/cascade/cascade.go     |  219 ++
29
+ .../providers/cascade/cascade_disks.go             |  253 ++
30
+ .../providers/cascade/cascade_instances.go         |  133 +
31
+ .../providers/cascade/cascade_instances_test.go    |   44 +
32
+ .../providers/cascade/cascade_loadbalancer.go      |  301 +++
33
+ pkg/cloudprovider/providers/cascade/client.go      |  400 +++
34
+ pkg/cloudprovider/providers/cascade/oidcclient.go  |  297 +++
35
+ pkg/cloudprovider/providers/cascade/restclient.go  |  262 ++
36
+ pkg/cloudprovider/providers/cascade/tests_owed     |    5 +
37
+ pkg/cloudprovider/providers/cascade/utils.go       |   29 +
38
+ pkg/cloudprovider/providers/providers.go           |    1 +
39
+ pkg/kubeapiserver/authorizer/config.go             |    7 +
40
+ pkg/kubeapiserver/authorizer/modes/modes.go        |    3 +-
41
+ pkg/kubeapiserver/options/plugins.go               |    3 +
42
+ pkg/printers/internalversion/describe.go           |   11 +
43
+ pkg/security/podsecuritypolicy/util/util.go        |    3 +
44
+ pkg/volume/cascade_disk/BUILD                      |   43 +
45
+ pkg/volume/cascade_disk/OWNERS                     |    2 +
46
+ pkg/volume/cascade_disk/attacher.go                |  273 ++
47
+ pkg/volume/cascade_disk/azure_disk_util.go         |  135 +
48
+ pkg/volume/cascade_disk/cascade_disk.go            |  399 +++
49
+ pkg/volume/cascade_disk/cascade_util.go            |  217 ++
50
+ .../storage/persistentvolume/label/admission.go    |   54 +
51
+ plugin/pkg/admission/vke/BUILD                     |   61 +
52
+ plugin/pkg/admission/vke/admission.go              |  662 +++++
53
+ plugin/pkg/admission/vke/admission_test.go         |  995 ++++++++
54
+ plugin/pkg/auth/authorizer/vke/BUILD               |   40 +
55
+ plugin/pkg/auth/authorizer/vke/OWNERS              |    2 +
56
+ plugin/pkg/auth/authorizer/vke/vke_authorizer.go   |  125 +
57
+ .../pkg/auth/authorizer/vke/vke_authorizer_test.go |  230 ++
58
+ staging/src/k8s.io/api/core/v1/generated.pb.go     | 2679 +++++++++++---------
59
+ staging/src/k8s.io/api/core/v1/types.go            |   24 +-
60
+ 54 files changed, 7378 insertions(+), 1214 deletions(-)
61
+ create mode 100644 pkg/cloudprovider/providers/cascade/BUILD
62
+ create mode 100644 pkg/cloudprovider/providers/cascade/OWNERS
63
+ create mode 100644 pkg/cloudprovider/providers/cascade/apitypes.go
64
+ create mode 100644 pkg/cloudprovider/providers/cascade/auth.go
65
+ create mode 100644 pkg/cloudprovider/providers/cascade/cascade.go
66
+ create mode 100644 pkg/cloudprovider/providers/cascade/cascade_disks.go
67
+ create mode 100644 pkg/cloudprovider/providers/cascade/cascade_instances.go
68
+ create mode 100644 pkg/cloudprovider/providers/cascade/cascade_instances_test.go
69
+ create mode 100644 pkg/cloudprovider/providers/cascade/cascade_loadbalancer.go
70
+ create mode 100644 pkg/cloudprovider/providers/cascade/client.go
71
+ create mode 100644 pkg/cloudprovider/providers/cascade/oidcclient.go
72
+ create mode 100644 pkg/cloudprovider/providers/cascade/restclient.go
73
+ create mode 100644 pkg/cloudprovider/providers/cascade/tests_owed
74
+ create mode 100644 pkg/cloudprovider/providers/cascade/utils.go
75
+ create mode 100644 pkg/volume/cascade_disk/BUILD
76
+ create mode 100644 pkg/volume/cascade_disk/OWNERS
77
+ create mode 100644 pkg/volume/cascade_disk/attacher.go
78
+ create mode 100644 pkg/volume/cascade_disk/azure_disk_util.go
79
+ create mode 100644 pkg/volume/cascade_disk/cascade_disk.go
80
+ create mode 100644 pkg/volume/cascade_disk/cascade_util.go
81
+ create mode 100644 plugin/pkg/admission/vke/BUILD
82
+ create mode 100644 plugin/pkg/admission/vke/admission.go
83
+ create mode 100644 plugin/pkg/admission/vke/admission_test.go
84
+ create mode 100644 plugin/pkg/auth/authorizer/vke/BUILD
85
+ create mode 100644 plugin/pkg/auth/authorizer/vke/OWNERS
86
+ create mode 100644 plugin/pkg/auth/authorizer/vke/vke_authorizer.go
87
+ create mode 100644 plugin/pkg/auth/authorizer/vke/vke_authorizer_test.go
88
+
89
+diff --git a/api/api-rules/violation_exceptions.list b/api/api-rules/violation_exceptions.list
90
+index 4bb9079..22dd6f6 100644
91
+--- a/api/api-rules/violation_exceptions.list
92
+@@ -12,6 +12,7 @@ API rule violation: names_match,k8s.io/api/core/v1,ISCSIVolumeSource,SessionCHAP
93
+ API rule violation: names_match,k8s.io/api/core/v1,NodeResources,Capacity
94
+ API rule violation: names_match,k8s.io/api/core/v1,NodeSpec,DoNotUse_ExternalID
95
+ API rule violation: names_match,k8s.io/api/core/v1,PersistentVolumeSource,CephFS
96
++API rule violation: names_match,k8s.io/api/core/v1,PersistentVolumeSource,CascadeDisk
97
+ API rule violation: names_match,k8s.io/api/core/v1,PersistentVolumeSource,StorageOS
98
+ API rule violation: names_match,k8s.io/api/core/v1,PodSpec,DeprecatedServiceAccount
99
+ API rule violation: names_match,k8s.io/api/core/v1,RBDPersistentVolumeSource,CephMonitors
100
+@@ -23,6 +24,7 @@ API rule violation: names_match,k8s.io/api/core/v1,RBDVolumeSource,RBDImage
101
+ API rule violation: names_match,k8s.io/api/core/v1,RBDVolumeSource,RBDPool
102
+ API rule violation: names_match,k8s.io/api/core/v1,RBDVolumeSource,RadosUser
103
+ API rule violation: names_match,k8s.io/api/core/v1,VolumeSource,CephFS
104
++API rule violation: names_match,k8s.io/api/core/v1,VolumeSource,CascadeDisk
105
+ API rule violation: names_match,k8s.io/api/core/v1,VolumeSource,StorageOS
106
+ API rule violation: names_match,k8s.io/api/extensions/v1beta1,CustomMetricCurrentStatus,CurrentValue
107
+ API rule violation: names_match,k8s.io/api/extensions/v1beta1,CustomMetricTarget,TargetValue
108
+diff --git a/api/swagger-spec/apps_v1alpha1.json b/api/swagger-spec/apps_v1alpha1.json
109
+index 6f54662..0ce6f3f 100644
110
+--- a/api/swagger-spec/apps_v1alpha1.json
111
+@@ -1459,6 +1459,10 @@
112
+      "photonPersistentDisk": {
113
+       "$ref": "v1.PhotonPersistentDiskVolumeSource",
114
+       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
115
++     },
116
++     "vkeDisk": {
117
++      "$ref": "v1.CascadeDiskVolumeSource",
118
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
119
+      }
120
+     }
121
+    },
122
+@@ -2109,6 +2113,23 @@
123
+      }
124
+     }
125
+    },
126
++   "v1.CascadeDiskVolumeSource": {
127
++    "id": "v1.CascadeDiskVolumeSource",
128
++    "description": "Represents a Cascade persistent disk resource.",
129
++    "required": [
130
++     "diskID"
131
++    ],
132
++    "properties": {
133
++     "diskID": {
134
++      "type": "string",
135
++      "description": "ID that identifies Cascade persistent disk"
136
++     },
137
++     "fsType": {
138
++      "type": "string",
139
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
140
++     }
141
++    }
142
++   },
143
+    "v1.Container": {
144
+     "id": "v1.Container",
145
+     "description": "A single application container that you want to run within a pod.",
146
+diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json
147
+index bef932e..af6fc8e 100644
148
+--- a/api/swagger-spec/apps_v1beta1.json
149
+@@ -4716,6 +4716,10 @@
150
+       "$ref": "v1.PhotonPersistentDiskVolumeSource",
151
+       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
152
+      },
153
++     "vkeDisk": {
154
++      "$ref": "v1.CascadeDiskVolumeSource",
155
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
156
++     },
157
+      "projected": {
158
+       "$ref": "v1.ProjectedVolumeSource",
159
+       "description": "Items for all in one resources secrets, configmaps, and downward API"
160
+@@ -5447,6 +5451,23 @@
161
+      }
162
+     }
163
+    },
164
++   "v1.CascadeDiskVolumeSource": {
165
++    "id": "v1.CascadeDiskVolumeSource",
166
++    "description": "Represents a Cascade persistent disk resource.",
167
++    "required": [
168
++     "diskID"
169
++    ],
170
++    "properties": {
171
++     "diskID": {
172
++      "type": "string",
173
++      "description": "ID that identifies Cascade persistent disk"
174
++     },
175
++     "fsType": {
176
++      "type": "string",
177
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
178
++     }
179
++    }
180
++   },
181
+    "v1.ProjectedVolumeSource": {
182
+     "id": "v1.ProjectedVolumeSource",
183
+     "description": "Represents a projected volume source",
184
+diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json
185
+index 9a17b8a..6110a0c 100644
186
+--- a/api/swagger-spec/apps_v1beta2.json
187
+@@ -7204,6 +7204,10 @@
188
+       "$ref": "v1.PhotonPersistentDiskVolumeSource",
189
+       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
190
+      },
191
++     "vkeDisk": {
192
++      "$ref": "v1.CascadeDiskVolumeSource",
193
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
194
++     },
195
+      "projected": {
196
+       "$ref": "v1.ProjectedVolumeSource",
197
+       "description": "Items for all in one resources secrets, configmaps, and downward API"
198
+@@ -7935,6 +7939,23 @@
199
+      }
200
+     }
201
+    },
202
++   "v1.CascadeDiskVolumeSource": {
203
++    "id": "v1.CascadeDiskVolumeSource",
204
++    "description": "Represents a Cascade persistent disk resource.",
205
++    "required": [
206
++     "diskID"
207
++    ],
208
++    "properties": {
209
++     "diskID": {
210
++      "type": "string",
211
++      "description": "ID that identifies Cascade persistent disk"
212
++     },
213
++     "fsType": {
214
++      "type": "string",
215
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
216
++     }
217
++    }
218
++   },
219
+    "v1.ProjectedVolumeSource": {
220
+     "id": "v1.ProjectedVolumeSource",
221
+     "description": "Represents a projected volume source",
222
+diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json
223
+index fe5738c..f6d1c85 100644
224
+--- a/api/swagger-spec/batch_v1.json
225
+@@ -1900,6 +1900,10 @@
226
+       "$ref": "v1.PhotonPersistentDiskVolumeSource",
227
+       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
228
+      },
229
++     "vkeDisk": {
230
++      "$ref": "v1.CascadeDiskVolumeSource",
231
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
232
++     },
233
+      "projected": {
234
+       "$ref": "v1.ProjectedVolumeSource",
235
+       "description": "Items for all in one resources secrets, configmaps, and downward API"
236
+@@ -2631,6 +2635,23 @@
237
+      }
238
+     }
239
+    },
240
++   "v1.CascadeDiskVolumeSource": {
241
++    "id": "v1.CascadeDiskVolumeSource",
242
++    "description": "Represents a Cascade persistent disk resource.",
243
++    "required": [
244
++     "diskID"
245
++    ],
246
++    "properties": {
247
++     "diskID": {
248
++      "type": "string",
249
++      "description": "ID that identifies Cascade persistent disk"
250
++     },
251
++     "fsType": {
252
++      "type": "string",
253
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
254
++     }
255
++    }
256
++   },
257
+    "v1.ProjectedVolumeSource": {
258
+     "id": "v1.ProjectedVolumeSource",
259
+     "description": "Represents a projected volume source",
260
+diff --git a/api/swagger-spec/batch_v1beta1.json b/api/swagger-spec/batch_v1beta1.json
261
+index c363a04..7ffe010 100644
262
+--- a/api/swagger-spec/batch_v1beta1.json
263
+@@ -1955,6 +1955,10 @@
264
+       "$ref": "v1.PhotonPersistentDiskVolumeSource",
265
+       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
266
+      },
267
++     "vkeDisk": {
268
++      "$ref": "v1.CascadeDiskVolumeSource",
269
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
270
++     },
271
+      "projected": {
272
+       "$ref": "v1.ProjectedVolumeSource",
273
+       "description": "Items for all in one resources secrets, configmaps, and downward API"
274
+@@ -2686,6 +2690,23 @@
275
+      }
276
+     }
277
+    },
278
++   "v1.CascadeDiskVolumeSource": {
279
++    "id": "v1.CascadeDiskVolumeSource",
280
++    "description": "Represents a Cascade persistent disk resource.",
281
++    "required": [
282
++     "diskID"
283
++    ],
284
++    "properties": {
285
++     "diskID": {
286
++      "type": "string",
287
++      "description": "ID that identifies Cascade persistent disk"
288
++     },
289
++     "fsType": {
290
++      "type": "string",
291
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
292
++     }
293
++    }
294
++   },
295
+    "v1.ProjectedVolumeSource": {
296
+     "id": "v1.ProjectedVolumeSource",
297
+     "description": "Represents a projected volume source",
298
+diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json
299
+index c7a31c3..723ece3 100644
300
+--- a/api/swagger-spec/batch_v2alpha1.json
301
+@@ -1970,6 +1970,10 @@
302
+      "storageos": {
303
+       "$ref": "v1.StorageOSVolumeSource",
304
+       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
305
++     },
306
++     "vkeDisk": {
307
++      "$ref": "v1.CascadeDiskVolumeSource",
308
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
309
+      }
310
+     }
311
+    },
312
+@@ -2904,6 +2908,23 @@
313
+      }
314
+     }
315
+    },
316
++   "v1.CascadeDiskVolumeSource": {
317
++    "id": "v1.CascadeDiskVolumeSource",
318
++    "description": "Represents a Cascade persistent disk resource.",
319
++    "required": [
320
++     "diskID"
321
++    ],
322
++    "properties": {
323
++     "diskID": {
324
++      "type": "string",
325
++      "description": "ID that identifies Cascade persistent disk"
326
++     },
327
++     "fsType": {
328
++      "type": "string",
329
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
330
++     }
331
++    }
332
++   },
333
+    "v1.Container": {
334
+     "id": "v1.Container",
335
+     "description": "A single application container that you want to run within a pod.",
336
+diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json
337
+index 2bc7702..7b5f910 100644
338
+--- a/api/swagger-spec/extensions_v1beta1.json
339
+@@ -7915,6 +7915,11 @@
340
+      "storageos": {
341
+       "$ref": "v1.StorageOSVolumeSource",
342
+       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
343
++     },
344
++     "vkeDisk": {
345
++      "$ref": "v1.CascadeDiskVolumeSource",
346
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
347
++     }
348
+      }
349
+     }
350
+    },
351
+@@ -8631,6 +8636,23 @@
352
+      }
353
+     }
354
+    },
355
++   "v1.CascadeDiskVolumeSource": {
356
++    "id": "v1.CascadeDiskVolumeSource",
357
++    "description": "Represents a Cascade persistent disk resource.",
358
++    "required": [
359
++     "diskID"
360
++    ],
361
++    "properties": {
362
++     "diskID": {
363
++      "type": "string",
364
++      "description": "ID that identifies Cascade persistent disk"
365
++     },
366
++     "fsType": {
367
++      "type": "string",
368
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
369
++     }
370
++    }
371
++   },
372
+    "v1.ProjectedVolumeSource": {
373
+     "id": "v1.ProjectedVolumeSource",
374
+     "description": "Represents a projected volume source",
375
+diff --git a/api/swagger-spec/settings.k8s.io_v1alpha1.json b/api/swagger-spec/settings.k8s.io_v1alpha1.json
376
+index 7542a77..f220fee 100644
377
+--- a/api/swagger-spec/settings.k8s.io_v1alpha1.json
378
+@@ -1721,6 +1721,10 @@
379
+      "storageos": {
380
+       "$ref": "v1.StorageOSVolumeSource",
381
+       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
382
++     },
383
++     "vkeDisk": {
384
++      "$ref": "v1.CascadeDiskVolumeSource",
385
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
386
+      }
387
+     }
388
+    },
389
+@@ -2399,6 +2403,23 @@
390
+      }
391
+     }
392
+    },
393
++   "v1.CascadeDiskVolumeSource": {
394
++    "id": "v1.CascadeDiskVolumeSource",
395
++    "description": "Represents a Cascade persistent disk resource.",
396
++    "required": [
397
++     "diskID"
398
++    ],
399
++    "properties": {
400
++     "diskID": {
401
++      "type": "string",
402
++      "description": "ID that identifies Cascade persistent disk"
403
++     },
404
++     "fsType": {
405
++      "type": "string",
406
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
407
++     }
408
++    }
409
++   },
410
+    "v1.ProjectedVolumeSource": {
411
+     "id": "v1.ProjectedVolumeSource",
412
+     "description": "Represents a projected volume source",
413
+diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json
414
+index be9f2e3..41f1b4a 100644
415
+--- a/api/swagger-spec/v1.json
416
+@@ -20272,6 +20272,10 @@
417
+       "$ref": "v1.PhotonPersistentDiskVolumeSource",
418
+       "description": "PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine"
419
+      },
420
++     "vkeDisk": {
421
++      "$ref": "v1.CascadeDiskVolumeSource",
422
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
423
++     },
424
+      "portworxVolume": {
425
+       "$ref": "v1.PortworxVolumeSource",
426
+       "description": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine"
427
+@@ -20841,6 +20845,23 @@
428
+      }
429
+     }
430
+    },
431
++   "v1.CascadeDiskVolumeSource": {
432
++    "id": "v1.CascadeDiskVolumeSource",
433
++    "description": "Represents a Cascade persistent disk resource.",
434
++    "required": [
435
++     "diskID"
436
++    ],
437
++    "properties": {
438
++     "diskID": {
439
++      "type": "string",
440
++      "description": "ID that identifies Cascade persistent disk"
441
++     },
442
++     "fsType": {
443
++      "type": "string",
444
++      "description": "Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. \"ext4\", \"xfs\", \"ntfs\". Implicitly inferred to be \"ext4\" if unspecified."
445
++     }
446
++    }
447
++   },
448
+    "v1.PortworxVolumeSource": {
449
+     "id": "v1.PortworxVolumeSource",
450
+     "description": "PortworxVolumeSource represents a Portworx volume resource.",
451
+@@ -21408,6 +21429,10 @@
452
+      "storageos": {
453
+       "$ref": "v1.StorageOSVolumeSource",
454
+       "description": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes."
455
++     },
456
++     "vkeDisk": {
457
++      "$ref": "v1.CascadeDiskVolumeSource",
458
++      "description": "vkeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine"
459
+      }
460
+     }
461
+    },
462
+diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD
463
+index cd36af5..48a5800 100644
464
+--- a/cmd/kube-controller-manager/app/BUILD
465
+@@ -87,6 +87,7 @@ go_library(
466
+         "//pkg/volume/aws_ebs:go_default_library",
467
+         "//pkg/volume/azure_dd:go_default_library",
468
+         "//pkg/volume/azure_file:go_default_library",
469
++        "//pkg/volume/cascade_disk:go_default_library",
470
+         "//pkg/volume/cinder:go_default_library",
471
+         "//pkg/volume/csi:go_default_library",
472
+         "//pkg/volume/fc:go_default_library",
473
+diff --git a/cmd/kube-controller-manager/app/plugins.go b/cmd/kube-controller-manager/app/plugins.go
474
+index ba9bb40..3b99b94 100644
475
+--- a/cmd/kube-controller-manager/app/plugins.go
476
+@@ -33,6 +33,7 @@ import (
477
+ 	"k8s.io/kubernetes/pkg/volume/aws_ebs"
478
+ 	"k8s.io/kubernetes/pkg/volume/azure_dd"
479
+ 	"k8s.io/kubernetes/pkg/volume/azure_file"
480
++	"k8s.io/kubernetes/pkg/volume/cascade_disk"
481
+ 	"k8s.io/kubernetes/pkg/volume/cinder"
482
+ 	"k8s.io/kubernetes/pkg/volume/csi"
483
+ 	"k8s.io/kubernetes/pkg/volume/fc"
484
+@@ -78,6 +79,7 @@ func ProbeAttachableVolumePlugins() []volume.VolumePlugin {
485
+ 	allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...)
486
+ 	allPlugins = append(allPlugins, iscsi.ProbeVolumePlugins()...)
487
+ 	allPlugins = append(allPlugins, rbd.ProbeVolumePlugins()...)
488
++	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
489
+ 	if utilfeature.DefaultFeatureGate.Enabled(features.CSIPersistentVolume) {
490
+ 		allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...)
491
+ 	}
492
+@@ -108,6 +110,7 @@ func ProbeExpandableVolumePlugins(config kubectrlmgrconfig.VolumeConfiguration)
493
+ 	allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...)
494
+ 	allPlugins = append(allPlugins, storageos.ProbeVolumePlugins()...)
495
+ 	allPlugins = append(allPlugins, fc.ProbeVolumePlugins()...)
496
++	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
497
+ 	return allPlugins
498
+ }
499
+ 
500
+@@ -164,6 +167,7 @@ func ProbeControllerVolumePlugins(cloud cloudprovider.Interface, config kubectrl
501
+ 	allPlugins = append(allPlugins, vsphere_volume.ProbeVolumePlugins()...)
502
+ 	allPlugins = append(allPlugins, azure_dd.ProbeVolumePlugins()...)
503
+ 	allPlugins = append(allPlugins, photon_pd.ProbeVolumePlugins()...)
504
++	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
505
+ 
506
+ 	return allPlugins
507
+ }
508
+diff --git a/cmd/kubelet/app/BUILD b/cmd/kubelet/app/BUILD
509
+index aa1948c..65a6486 100644
510
+--- a/cmd/kubelet/app/BUILD
511
+@@ -72,6 +72,7 @@ go_library(
512
+         "//pkg/volume/aws_ebs:go_default_library",
513
+         "//pkg/volume/azure_dd:go_default_library",
514
+         "//pkg/volume/azure_file:go_default_library",
515
++       "//pkg/volume/cascade_disk:go_default_library",
516
+         "//pkg/volume/cephfs:go_default_library",
517
+         "//pkg/volume/cinder:go_default_library",
518
+         "//pkg/volume/configmap:go_default_library",
519
+diff --git a/cmd/kubelet/app/plugins.go b/cmd/kubelet/app/plugins.go
520
+index 4f3c392..577a995 100644
521
+--- a/cmd/kubelet/app/plugins.go
522
+@@ -29,6 +29,7 @@ import (
523
+ 	"k8s.io/kubernetes/pkg/volume/aws_ebs"
524
+ 	"k8s.io/kubernetes/pkg/volume/azure_dd"
525
+ 	"k8s.io/kubernetes/pkg/volume/azure_file"
526
++	"k8s.io/kubernetes/pkg/volume/cascade_disk"
527
+ 	"k8s.io/kubernetes/pkg/volume/cephfs"
528
+ 	"k8s.io/kubernetes/pkg/volume/cinder"
529
+ 	"k8s.io/kubernetes/pkg/volume/configmap"
530
+@@ -97,6 +98,7 @@ func ProbeVolumePlugins() []volume.VolumePlugin {
531
+ 	allPlugins = append(allPlugins, scaleio.ProbeVolumePlugins()...)
532
+ 	allPlugins = append(allPlugins, local.ProbeVolumePlugins()...)
533
+ 	allPlugins = append(allPlugins, storageos.ProbeVolumePlugins()...)
534
++	allPlugins = append(allPlugins, cascade_disk.ProbeVolumePlugins()...)
535
+ 	if utilfeature.DefaultFeatureGate.Enabled(features.CSIPersistentVolume) {
536
+ 		allPlugins = append(allPlugins, csi.ProbeVolumePlugins()...)
537
+ 	}
538
+diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go
539
+index 702ffa4..c5adc67 100644
540
+--- a/pkg/apis/core/types.go
541
+@@ -154,6 +154,8 @@ type VolumeSource struct {
542
+ 	// StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod
543
+ 	// +optional
544
+ 	StorageOS *StorageOSVolumeSource
545
++	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
546
++	CascadeDisk *CascadeDiskVolumeSource
547
+ }
548
+ 
549
+ // Similar to VolumeSource but meant for the administrator who creates PVs.
550
+@@ -232,6 +234,8 @@ type PersistentVolumeSource struct {
551
+ 	// CSI (Container Storage Interface) represents storage that handled by an external CSI driver (Beta feature).
552
+ 	// +optional
553
+ 	CSI *CSIPersistentVolumeSource
554
++	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
555
++	CascadeDisk *CascadeDiskVolumeSource
556
+ }
557
+ 
558
+ type PersistentVolumeClaimVolumeSource struct {
559
+@@ -1390,6 +1394,16 @@ type StorageOSPersistentVolumeSource struct {
560
+ 	SecretRef *ObjectReference
561
+ }
562
+ 
563
++// Represents a Cascade persistent disk resource.
564
++type CascadeDiskVolumeSource struct {
565
++	// ID that identifies Cascade persistent disk
566
++	DiskID string
567
++	// Filesystem type to mount.
568
++	// Must be a filesystem type supported by the host operating system.
569
++	// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
570
++	FSType string
571
++}
572
++
573
+ // Adapts a ConfigMap into a volume.
574
+ //
575
+ // The contents of the target ConfigMap's Data field will be presented in a
576
+diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go
577
+index db06578..1d5df92 100644
578
+--- a/pkg/apis/core/validation/validation.go
579
+@@ -640,6 +640,14 @@ func validateVolumeSource(source *core.VolumeSource, fldPath *field.Path, volNam
580
+ 		}
581
+ 	}
582
+ 
583
++	if source.CascadeDisk != nil {
584
++		if numVolumes > 0 {
585
++			allErrs = append(allErrs, field.Forbidden(fldPath.Child("cascadeDisk"), "may not specify more than 1 volume type"))
586
++		} else {
587
++			numVolumes++
588
++			allErrs = append(allErrs, validateCascadeDiskVolumeSource(source.CascadeDisk, fldPath.Child("cascadeDisk"))...)
589
++		}
590
++	}
591
+ 	if numVolumes == 0 {
592
+ 		allErrs = append(allErrs, field.Required(fldPath, "must specify a volume type"))
593
+ 	}
594
+@@ -1492,6 +1500,14 @@ func validateCSIPersistentVolumeSource(csi *core.CSIPersistentVolumeSource, fldP
595
+ 	return allErrs
596
+ }
597
+ 
598
++func validateCascadeDiskVolumeSource(cd *core.CascadeDiskVolumeSource, fldPath *field.Path) field.ErrorList {
599
++	allErrs := field.ErrorList{}
600
++	if len(cd.DiskID) == 0 {
601
++		allErrs = append(allErrs, field.Required(fldPath.Child("diskID"), ""))
602
++	}
603
++	return allErrs
604
++}
605
++
606
+ // ValidatePersistentVolumeName checks that a name is appropriate for a
607
+ // PersistentVolumeName object.
608
+ var ValidatePersistentVolumeName = apimachineryvalidation.NameIsDNSSubdomain
609
+@@ -1730,6 +1746,15 @@ func ValidatePersistentVolume(pv *core.PersistentVolume) field.ErrorList {
610
+ 		}
611
+ 	}
612
+ 
613
++	if pv.Spec.CascadeDisk != nil {
614
++		if numVolumes > 0 {
615
++			allErrs = append(allErrs, field.Forbidden(specPath.Child("cascadeDisk"), "may not specify more than 1 volume type"))
616
++		} else {
617
++			numVolumes++
618
++			allErrs = append(allErrs, validateCascadeDiskVolumeSource(pv.Spec.CascadeDisk, specPath.Child("cascadeDisk"))...)
619
++		}
620
++	}
621
++
622
+ 	if numVolumes == 0 {
623
+ 		allErrs = append(allErrs, field.Required(specPath, "must specify a volume type"))
624
+ 	}
625
+diff --git a/pkg/apis/policy/types.go b/pkg/apis/policy/types.go
626
+index 7b96286..ea8102e 100644
627
+--- a/pkg/apis/policy/types.go
628
+@@ -295,6 +295,7 @@ var (
629
+ 	PortworxVolume        FSType = "portworxVolume"
630
+ 	ScaleIO               FSType = "scaleIO"
631
+ 	CSI                   FSType = "csi"
632
++	CascadeDisk           FSType = "cascadeDisk"
633
+ 	All                   FSType = "*"
634
+ )
635
+ 
636
+diff --git a/pkg/cloudprovider/providers/BUILD b/pkg/cloudprovider/providers/BUILD
637
+index aeccfa1..4313576 100644
638
+--- a/pkg/cloudprovider/providers/BUILD
639
+@@ -12,6 +12,7 @@ go_library(
640
+     deps = [
641
+         "//pkg/cloudprovider/providers/aws:go_default_library",
642
+         "//pkg/cloudprovider/providers/azure:go_default_library",
643
++        "//pkg/cloudprovider/providers/cascade:go_default_library",
644
+         "//pkg/cloudprovider/providers/cloudstack:go_default_library",
645
+         "//pkg/cloudprovider/providers/gce:go_default_library",
646
+         "//pkg/cloudprovider/providers/openstack:go_default_library",
647
+@@ -34,6 +35,7 @@ filegroup(
648
+         ":package-srcs",
649
+         "//pkg/cloudprovider/providers/aws:all-srcs",
650
+         "//pkg/cloudprovider/providers/azure:all-srcs",
651
++        "//pkg/cloudprovider/providers/cascade:all-srcs",
652
+         "//pkg/cloudprovider/providers/cloudstack:all-srcs",
653
+         "//pkg/cloudprovider/providers/fake:all-srcs",
654
+         "//pkg/cloudprovider/providers/gce:all-srcs",
655
+diff --git a/pkg/cloudprovider/providers/cascade/BUILD b/pkg/cloudprovider/providers/cascade/BUILD
656
+new file mode 100644
657
+index 0000000..4089166
658
+--- /dev/null
659
+@@ -0,0 +1,56 @@
660
++package(default_visibility = ["//visibility:public"])
661
++
662
++load(
663
++    "@io_bazel_rules_go//go:def.bzl",
664
++    "go_library",
665
++)
666
++
667
++go_library(
668
++    name = "go_default_library",
669
++    srcs = [
670
++        "apitypes.go",
671
++        "auth.go",
672
++        "cascade.go",
673
++        "cascade_disks.go",
674
++        "cascade_instances.go",
675
++        "cascade_loadbalancer.go",
676
++        "client.go",
677
++        "oidcclient.go",
678
++        "restclient.go",
679
++        "utils.go"
680
++        ],
681
++    deps = [
682
++        "//pkg/api/v1/helper:go_default_library",
683
++        "//pkg/cloudprovider:go_default_library",
684
++        "//pkg/controller:go_default_library",
685
++        "//vendor/github.com/golang/glog:go_default_library",
686
++        "//vendor/gopkg.in/gcfg.v1:go_default_library",
687
++        "//vendor/k8s.io/api/core/v1:go_default_library",
688
++        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
689
++    ],
690
++)
691
++
692
++go_test(
693
++    name = "go_default_test",
694
++    srcs = [
695
++        "cascade_instances_test.go",
696
++    ],
697
++    embed = [":go_default_library"],
698
++    deps = [
699
++        "//vendor/k8s.io/api/core/v1:go_default_library",
700
++        "//vendor/github.com/stretchr/testify/assert:go_default_library",
701
++    ],
702
++)
703
++
704
++filegroup(
705
++    name = "package-srcs",
706
++    srcs = glob(["**"]),
707
++    tags = ["automanaged"],
708
++    visibility = ["//visibility:private"],
709
++)
710
++
711
++filegroup(
712
++    name = "all-srcs",
713
++    srcs = [":package-srcs"],
714
++    tags = ["automanaged"],
715
++)
716
+diff --git a/pkg/cloudprovider/providers/cascade/OWNERS b/pkg/cloudprovider/providers/cascade/OWNERS
717
+new file mode 100644
718
+index 0000000..70efc9d
719
+--- /dev/null
720
+@@ -0,0 +1,3 @@
721
++maintainers:
722
++- ashokc
723
++- ysheng
724
+diff --git a/pkg/cloudprovider/providers/cascade/apitypes.go b/pkg/cloudprovider/providers/cascade/apitypes.go
725
+new file mode 100644
726
+index 0000000..d437394
727
+--- /dev/null
728
+@@ -0,0 +1,230 @@
729
++package cascade
730
++
731
++import "fmt"
732
++
733
++const (
734
++	NotFoundError     = 1408
735
++	VMNotFoundError   = 2006
736
++	DiskNotFoundError = 3011
737
++	DiskInUseError    = 3012
738
++
739
++	DiskStateAttached = "ATTACHED"
740
++)
741
++
742
++// Represents APIError returned by the API in case of an error.
743
++type APIError struct {
744
++	Code           *string           `json:"code"`
745
++	Data           map[string]string `json:"data"`
746
++	ErrorCode      int32             `json:"errorCode,omitempty"`
747
++	Message        *string           `json:"message"`
748
++	HttpStatusCode int               `json:"-"` // Not part of API contract
749
++}
750
++
751
++// Implement Go error interface for ApiError.
752
++func (e APIError) Error() string {
753
++	return fmt.Sprintf(
754
++		"Cascade: { HTTP status: '%d', code: '%s', message: '%s', data: '%v', errorcode: '%d' }",
755
++		e.HttpStatusCode, StringVal(e.Code), StringVal(e.Message), e.Data, e.ErrorCode)
756
++}
757
++
758
++// Used to represent a generic HTTP error, i.e. an unexpected HTTP 500.
759
++type HttpError struct {
760
++	StatusCode int
761
++	Message    string
762
++}
763
++
764
++// Implementation of error interface for HttpError.
765
++func (e HttpError) Error() string {
766
++	return fmt.Sprintf("Cascade: HTTP %d: %v", e.StatusCode, e.Message)
767
++}
768
++
769
++// Represents a task which gets returned for long running API calls.
770
++type Task struct {
771
++	EndTime            int64       `json:"endTime,omitempty"`
772
++	Entity             *Entity     `json:"entity,omitempty"`
773
++	ID                 *string     `json:"id"`
774
++	Operation          string      `json:"operation,omitempty"`
775
++	QueuedTime         *int64      `json:"queuedTime"`
776
++	ResourceProperties interface{} `json:"resourceProperties,omitempty"`
777
++	SelfLink           string      `json:"selfLink,omitempty"`
778
++	StartedTime        *int64      `json:"startedTime"`
779
++	State              *string     `json:"state"`
780
++	Steps              []*Step     `json:"steps"`
781
++}
782
++
783
++// Represents the entity associated with the task.
784
++type Entity struct {
785
++	ID   *string `json:"id"`
786
++	Kind *string `json:"kind"`
787
++}
788
++
789
++// Represents a task that has entered into an error state. Task errors can be caught and type-checked against with the
790
++// usual Go idiom.
791
++type TaskError struct {
792
++	ID   string `json:"id"`
793
++	Step Step   `json:"step,omitempty"`
794
++}
795
++
796
++// Implement Go error interface for TaskError.
797
++func (e TaskError) Error() string {
798
++	return fmt.Sprintf("Cascade: Task '%s' is in error state: {@step==%s}", e.ID, GetStep(e.Step))
799
++}
800
++
801
++// An error representing a timeout while waiting for a task to complete.
802
++type TaskTimeoutError struct {
803
++	ID string
804
++}
805
++
806
++// Implement Go error interface for TaskTimeoutError.
807
++func (e TaskTimeoutError) Error() string {
808
++	return fmt.Sprintf("Cascade: Timed out waiting for task '%s'. "+
809
++		"Task may not be in error state, examine task for full details.", e.ID)
810
++}
811
++
812
++// Represents a step in a task.
813
++type Step struct {
814
++	EndTime     int64             `json:"endTime,omitempty"`
815
++	Errors      []*APIError       `json:"errors"`
816
++	Operation   string            `json:"operation,omitempty"`
817
++	Options     map[string]string `json:"options,omitempty"`
818
++	QueuedTime  *int64            `json:"queuedTime"`
819
++	Sequence    int32             `json:"sequence,omitempty"`
820
++	StartedTime *int64            `json:"startedTime"`
821
++	State       *string           `json:"state"`
822
++	Warnings    []*APIError       `json:"warnings"`
823
++}
824
++
825
++// Implement Go error interface for Step.
826
++func GetStep(s Step) string {
827
++	return fmt.Sprintf("{\"operation\"=>\"%s\",\"state\"=>\"%s}", s.Operation, StringVal(s.State))
828
++}
829
++
830
++// Represents the VM response returned by the API.
831
++type VM struct {
832
++	AttachedDisks          []*AttachedDisk  `json:"attachedDisks"`
833
++	Cost                   []*QuotaLineItem `json:"cost"`
834
++	Flavor                 *string          `json:"flavor"`
835
++	FloatingIP             string           `json:"floatingIp,omitempty"`
836
++	HighAvailableVMGroupID string           `json:"highAvailableVMGroupID,omitempty"`
837
++	ID                     *string          `json:"id"`
838
++	Kind                   string           `json:"kind"`
839
++	Name                   *string          `json:"name"`
840
++	SelfLink               string           `json:"selfLink,omitempty"`
841
++	SourceImageID          string           `json:"sourceImageId,omitempty"`
842
++	State                  *string          `json:"state"`
843
++	Subnets                []string         `json:"subnets"`
844
++	Tags                   []string         `json:"tags"`
845
++}
846
++
847
++// Represents the listVMs response returned by the API.
848
++type VMList struct {
849
++	Items            []*VM  `json:"items"`
850
++	NextPageLink     string `json:"nextPageLink,omitempty"`
851
++	PreviousPageLink string `json:"previousPageLink,omitempty"`
852
++}
853
++
854
++// Represents multiple VMs returned by the API.
855
++type VMs struct {
856
++	Items []VM `json:"items"`
857
++}
858
++
859
++// Represents the disks attached to the VMs.
860
++type AttachedDisk struct {
861
++	BootDisk   *bool   `json:"bootDisk"`
862
++	CapacityGb *int32  `json:"capacityGb"`
863
++	Flavor     *string `json:"flavor"`
864
++	ID         *string `json:"id"`
865
++	Kind       *string `json:"kind"`
866
++	Name       *string `json:"name"`
867
++	State      *string `json:"state"`
868
++}
869
++
870
++// Represents an attach disk operation request.
871
++type VMDiskOperation struct {
872
++	Arguments map[string]string `json:"arguments,omitempty"`
873
++	DiskID    *string           `json:"diskId"`
874
++}
875
++
876
++// Represents the quota line items for the VM.
877
++type QuotaLineItem struct {
878
++	Key   *string  `json:"key"`
879
++	Unit  *string  `json:"unit"`
880
++	Value *float64 `json:"value"`
881
++}
882
++
883
++// Represents a persistent disk
884
++type PersistentDisk struct {
885
++	CapacityGB  int32            `json:"capacityGb,omitempty"`
886
++	Cost        []*QuotaLineItem `json:"cost"`
887
++	Datastore   string           `json:"datastore,omitempty"`
888
++	Flavor      *string          `json:"flavor"`
889
++	ID          *string          `json:"id"`
890
++	Kind        string           `json:"kind"`
891
++	Name        *string          `json:"name"`
892
++	SelfLink    string           `json:"selfLink,omitempty"`
893
++	State       *string          `json:"state"`
894
++	Tags        []string         `json:"tags"`
895
++	VM          string           `json:"vm"`
896
++	MountDevice string           `json:"mountDevice,omitempty"`
897
++	Zone        *string          `json:"zone"`
898
++}
899
++
900
++// Represents the spec for creating a disk.
901
++type DiskCreateSpec struct {
902
++	Affinities []*LocalitySpec `json:"affinities"`
903
++	CapacityGB *int32          `json:"capacityGb"`
904
++	Flavor     *string         `json:"flavor"`
905
++	Kind       *string         `json:"kind"`
906
++	Name       *string         `json:"name"`
907
++	Tags       []string        `json:"tags"`
908
++	Zone       *string         `json:"zone"`
909
++	Encrypted  *bool           `json:"encrypted"`
910
++}
911
++
912
++// Represents the spec for specifying affinity for a disk with another entity.
913
++type LocalitySpec struct {
914
++	ID   *string `json:"id"`
915
++	Kind *string `json:"kind"`
916
++}
917
++
918
++// Represens the LoadBalancer response returned by the API.
919
++type LoadBalancer struct {
920
++	Endpoint *string `json:"endpoint"`
921
++}
922
++
923
++// Represents the spec for creating a LoadBalancer.
924
++type LoadBalancerCreateSpec struct {
925
++	HealthCheck *LoadBalancerHealthCheck `json:"healthCheck"`
926
++	Name        *string                  `json:"name"`
927
++	PortMaps    []*LoadBalancerPortMap   `json:"portMaps"`
928
++	Type        *string                  `json:"type"`
929
++	SubDomain   *string                  `json:"subDomain"`
930
++}
931
++
932
++// Represents the health check spec for a load balancer.
933
++type LoadBalancerHealthCheck struct {
934
++	HealthyThreshold  int64   `json:"healthyThreshold,omitempty"`
935
++	IntervalInSeconds int64   `json:"intervalInSeconds,omitempty"`
936
++	Path              *string `json:"path,omitempty"`
937
++	Port              *int64  `json:"port"`
938
++	Protocol          *string `json:"protocol"`
939
++}
940
++
941
++// Represents a port mapping spec for a load balancer.
942
++type LoadBalancerPortMap struct {
943
++	AllowedCidrs         []*string `json:"allowedCidrs"`
944
++	InstancePort         *int64    `json:"instancePort"`
945
++	InstanceProtocol     *string   `json:"instanceProtocol"`
946
++	LoadBalancerPort     *int64    `json:"loadBalancerPort"`
947
++	LoadBalancerProtocol *string   `json:"loadBalancerProtocol"`
948
++}
949
++
950
++// Represents a VM to be registered with or deregistered from the load balancer.
951
++type LoadBalancerVM struct {
952
++	ID *string `json:"id"`
953
++}
954
++
955
++// Represents a list of VMs to be registered with or deregistered from the load balancer.
956
++type LoadBalancerVMUpdate struct {
957
++	VMIds []*LoadBalancerVM `json:"vmIds"`
958
++}
959
+diff --git a/pkg/cloudprovider/providers/cascade/auth.go b/pkg/cloudprovider/providers/cascade/auth.go
960
+new file mode 100644
961
+index 0000000..fc92377
962
+--- /dev/null
963
+@@ -0,0 +1,145 @@
964
++package cascade
965
++
966
++import (
967
++	"fmt"
968
++	"strings"
969
++	"github.com/golang/glog"
970
++	"os/exec"
971
++)
972
++
973
++const (
974
++	tScope = "openid offline_access rs_admin_server at_groups rs_vmdir"
975
++
976
++	afdCli                     = "/opt/vmware/bin/vmafd-cli"
977
++	afdCliMachineAccountCmd    = "get-machine-account-info"
978
++	afdCliPasswordPrefix       = "Password: "
979
++	afdCliSeparator            = "\n"
980
++)
981
++
982
++// AuthConfig contains configuration information for the authentication client.
983
++type AuthConfig struct {
984
++	tenantName string
985
++	authEndpoint string
986
++	machineAccountName string
987
++}
988
++
989
++// AuthClient defines functions related to authentication.
990
++type AuthClient struct {
991
++	cfg *AuthConfig
992
++}
993
++
994
++// NewAuthClient creates a new authentication client
995
++func NewAuthClient(cascadeCfg *CascadeConfig) (*AuthClient, error) {
996
++	return &AuthClient{
997
++		cfg: &AuthConfig{
998
++			tenantName: cascadeCfg.Global.TenantName,
999
++			authEndpoint: cascadeCfg.Global.AuthEndpoint,
1000
++			machineAccountName: fmt.Sprintf("%s@%s", cascadeCfg.Global.DNSName, cascadeCfg.Global.DomainName),
1001
++		},
1002
++	}, nil
1003
++}
1004
++
1005
++func (c *AuthClient) GetTokensByMachineAccount() (*TokenOptions, error) {
1006
++	// Use the VMAFD CLI to get the machine account password
1007
++	cmd := exec.Command(afdCli, afdCliMachineAccountCmd)
1008
++	output, err := cmd.Output()
1009
++	if err != nil {
1010
++		glog.Errorf("Cascade Cloud Provider: Failed to get machine account credentials. Cannot create Client.")
1011
++		return nil, fmt.Errorf("Failed to get machine account credentials, err: %v", err)
1012
++	}
1013
++
1014
++	password, err := parseMachineAccountInfo(output)
1015
++	if err != nil {
1016
++		glog.Errorf("Cascade Cloud Provider: Failed to parse machine account credentials. Cannot create Client.")
1017
++		return nil, fmt.Errorf("Failed to parse machine account credentials, err: %v", err)
1018
++	}
1019
++
1020
++	return c.GetTokensByCredentials(c.cfg.machineAccountName, password)
1021
++}
1022
++
1023
++// GetTokensByPassword gets tokens using username and password
1024
++func (c *AuthClient) GetTokensByCredentials(username, password string) (*TokenOptions, error) {
1025
++	// Parse tenant part from username
1026
++	parts := strings.Split(username, "@")
1027
++	if len(parts) != 2 {
1028
++		return nil, fmt.Errorf("Invalid full user name '%s': expected user@tenant", username)
1029
++	}
1030
++	tenant := parts[1]
1031
++
1032
++	oidcClient, err := buildOIDCClient(c.cfg.authEndpoint)
1033
++	if err != nil {
1034
++		return nil, err
1035
++	}
1036
++
1037
++	tokenResponse, err := oidcClient.GetTokenByPasswordGrant(tenant, username, password)
1038
++	if err != nil {
1039
++		return nil, err
1040
++	}
1041
++
1042
++	return toTokenOptions(tokenResponse), nil
1043
++}
1044
++
1045
++// GetTokensByRefreshToken gets tokens using refresh token
1046
++func (c *AuthClient) GetTokensByRefreshToken(refreshtoken string) (*TokenOptions, error) {
1047
++	oidcClient, err := buildOIDCClient(c.cfg.authEndpoint)
1048
++	if err != nil {
1049
++		return nil, err
1050
++	}
1051
++
1052
++	tokenResponse, err := oidcClient.GetTokenByRefreshTokenGrant(c.cfg.tenantName, refreshtoken)
1053
++	if err != nil {
1054
++		return nil, err
1055
++	}
1056
++
1057
++	return toTokenOptions(tokenResponse), nil
1058
++}
1059
++
1060
++func buildOIDCClient(authEndpoint string) (*OIDCClient, error) {
1061
++	options := &OIDCClientOptions{
1062
++		IgnoreCertificate: false,
1063
++		RootCAs:           nil,
1064
++		TokenScope:        tScope,
1065
++	}
1066
++
1067
++	return NewOIDCClient(authEndpoint, options, nil), nil
1068
++}
1069
++
1070
++func toTokenOptions(response *OIDCTokenResponse) *TokenOptions {
1071
++	return &TokenOptions{
1072
++		AccessToken:  response.AccessToken,
1073
++		ExpiresIn:    response.ExpiresIn,
1074
++		RefreshToken: response.RefreshToken,
1075
++		IDToken:      response.IDToken,
1076
++		TokenType:    response.TokenType,
1077
++	}
1078
++}
1079
++
1080
++// parseMachineAccountInfo parses the machine account password from the machine-account-info output which looks like
1081
++// this:
1082
++//MachineAccount: photon-8rwdscr1.lw-testdom.com
1083
++//Password: FT`])}]d/3\EPwRpz9k1
1084
++func parseMachineAccountInfo(output []byte) (string, error) {
1085
++	if len(output) <= 0 {
1086
++		return "", fmt.Errorf("account info is not specified")
1087
++	}
1088
++
1089
++	strOut := string(output)
1090
++	strOutLen := len(strOut)
1091
++
1092
++	pwdStart := strings.Index(strOut, afdCliPasswordPrefix)
1093
++	if pwdStart < 0 {
1094
++		return "", fmt.Errorf("account info is not in expected format")
1095
++	}
1096
++	pwdStart = pwdStart + len(afdCliPasswordPrefix)
1097
++	if pwdStart >= strOutLen {
1098
++		return "", fmt.Errorf("account info is not in expected format")
1099
++	}
1100
++	pwdEnd := strings.LastIndex(strOut, afdCliSeparator)
1101
++	if pwdEnd < 0 || pwdEnd <= pwdStart || pwdEnd >= strOutLen {
1102
++		return "", fmt.Errorf("account info is not in expected format")
1103
++	}
1104
++
1105
++	pwd := strOut[pwdStart:pwdEnd]
1106
++
1107
++	return pwd, nil
1108
++}
1109
+\ No newline at end of file
1110
+diff --git a/pkg/cloudprovider/providers/cascade/cascade.go b/pkg/cloudprovider/providers/cascade/cascade.go
1111
+new file mode 100644
1112
+index 0000000..b9fafb9
1113
+--- /dev/null
1114
+@@ -0,0 +1,219 @@
1115
++// The use of Cascade cloud provider requires the kubelet, kube-apiserver, and kube-controller-manager to be started
1116
++// with config flag: '--cloud-provider=cascade --cloud-config=[path_to_config_file]'.
1117
++package cascade
1118
++
1119
++import (
1120
++	"context"
1121
++	"errors"
1122
++	"fmt"
1123
++	"github.com/golang/glog"
1124
++	"gopkg.in/gcfg.v1"
1125
++	"io"
1126
++	k8stypes "k8s.io/apimachinery/pkg/types"
1127
++	"k8s.io/kubernetes/pkg/cloudprovider"
1128
++	"k8s.io/kubernetes/pkg/controller"
1129
++	"os"
1130
++	"strings"
1131
++)
1132
++
1133
++const (
1134
++	ProviderName = "vke"
1135
++	DiskSpecKind = "persistent-disk"
1136
++	MasterPrefix = "master"
1137
++)
1138
++
1139
++// CascadeCloud is an implementation of the cloud provider interface for Cascade Controller.
1140
++type CascadeCloud struct {
1141
++	cfg *CascadeConfig
1142
++	// Authentication client to get token for Cascade API calls
1143
++	authClient *AuthClient
1144
++	// API Client to make Cascade API calls
1145
++	apiClient *Client
1146
++	// local $HOSTNAME
1147
++	localHostname string
1148
++	// hostname from K8S, could be overridden
1149
++	localK8sHostname string
1150
++}
1151
++
1152
++// CascadeCloud represents Cascade cloud provider's configuration.
1153
++type CascadeConfig struct {
1154
++	Global struct {
1155
++		// the Cascade Controller endpoint
1156
++		CloudTarget string `gcfg:"target"`
1157
++		// Cascade Controller tenantName name
1158
++		TenantName string `gcfg:"tenantName"`
1159
++		// Cascade Controller cluster ID
1160
++		ClusterID string `gcfg:"clusterID"`
1161
++		// Authentication server endpoint for Cascade Controller
1162
++		AuthEndpoint string `gcfg:"authEndpoint"`
1163
++		// Lightwave domain name for the node
1164
++		DomainName string `gcfg:"domainName"`
1165
++		// DNS name of the node.
1166
++		DNSName string `gcfg:"dnsName"`
1167
++		// Region in which the cluster is in
1168
++		Region string `gcfg:"region"`
1169
++		// Availability zone in which the cluster is in
1170
++		Zone string `gcfg:"zone"`
1171
++		// IP address of the node.
1172
++		IPAddress string `gcfg:"ipAddress"`
1173
++	}
1174
++}
1175
++
1176
++// Disks is interface for manipulation with Cascade Controller Persistent Disks.
1177
++type Disks interface {
1178
++	// AttachDisk attaches given disk to given node. Current node
1179
++	// is used when nodeName is empty string.
1180
++	AttachDisk(diskID string, nodeName k8stypes.NodeName) (string, error)
1181
++
1182
++	// DetachDisk detaches given disk to given node. Current node
1183
++	// is used when nodeName is empty string.
1184
++	DetachDisk(diskID string, nodeName k8stypes.NodeName) error
1185
++
1186
++	// DiskIsAttached checks if a disk is attached to the given node.
1187
++	DiskIsAttached(diskID string, nodeName k8stypes.NodeName) (bool, error)
1188
++
1189
++	// DisksAreAttached is a batch function to check if a list of disks are attached
1190
++	// to the node with the specified NodeName.
1191
++	DisksAreAttached(diskID []string, nodeName k8stypes.NodeName) (map[string]bool, error)
1192
++
1193
++	// CreateDisk creates a new PD with given properties.
1194
++	CreateDisk(volumeOptions *VolumeOptions) (diskID string, err error)
1195
++
1196
++	// DeleteDisk deletes PD.
1197
++	DeleteDisk(diskID string) error
1198
++
1199
++	// Get labels to apply to volume on creation.
1200
++	GetVolumeLabels(diskID string) (map[string]string, error)
1201
++}
1202
++
1203
++// VolumeOptions specifies capacity, tags, name and flavorID for a volume.
1204
++type VolumeOptions struct {
1205
++	CapacityGB        int
1206
++	Tags              map[string]string
1207
++	Name              string
1208
++	Type              string
1209
++	ZonePresent       bool
1210
++	ZonesPresent      bool
1211
++	AvailabilityZone  string
1212
++	AvailabilityZones string
1213
++	Encrypted         bool
1214
++}
1215
++
1216
++func readConfig(config io.Reader) (*CascadeConfig, error) {
1217
++	if config == nil {
1218
++		err := fmt.Errorf("Cascade Cloud Provider: config file is missing. Please restart with " +
1219
++			"--cloud-provider=cascade --cloud-config=[path_to_config_file]")
1220
++		return nil, err
1221
++	}
1222
++
1223
++	var cfg CascadeConfig
1224
++	err := gcfg.ReadInto(&cfg, config)
1225
++	return &cfg, err
1226
++}
1227
++
1228
++func init() {
1229
++	cloudprovider.RegisterCloudProvider(ProviderName, func(config io.Reader) (cloudprovider.Interface, error) {
1230
++		cfg, err := readConfig(config)
1231
++		if err != nil {
1232
++			glog.Errorf("Cascade Cloud Provider: failed to read in cloud provider config file. Error[%v]", err)
1233
++			return nil, err
1234
++		}
1235
++		return newCascadeCloud(cfg)
1236
++	})
1237
++}
1238
++
1239
++func newCascadeCloud(cfg *CascadeConfig) (*CascadeCloud, error) {
1240
++	if len(cfg.Global.CloudTarget) == 0 {
1241
++		return nil, fmt.Errorf("Cascade Controller endpoint was not specified.")
1242
++	}
1243
++
1244
++	// Get local hostname
1245
++	hostname, err := os.Hostname()
1246
++	if err != nil {
1247
++		glog.Errorf("Cascade Cloud Provider: get hostname failed. Error[%v]", err)
1248
++		return nil, err
1249
++	}
1250
++
1251
++	cc := CascadeCloud{
1252
++		cfg:              cfg,
1253
++		localHostname:    hostname,
1254
++		localK8sHostname: "",
1255
++	}
1256
++
1257
++	// Instantiate the auth and API clients only on the master nodes. Kubelets running on the workers don't need them as
1258
++	// they are used primarily for making API calls to Cascade.
1259
++	if strings.HasPrefix(hostname, MasterPrefix) {
1260
++		if cc.authClient, err = NewAuthClient(cfg); err != nil {
1261
++			return nil, err
1262
++		}
1263
++
1264
++		if cc.apiClient, err = NewClient(cfg, cc.authClient); err != nil {
1265
++			return nil, err
1266
++		}
1267
++	}
1268
++
1269
++	return &cc, nil
1270
++}
1271
++
1272
++// Initialize passes a Kubernetes clientBuilder interface to the cloud provider
1273
++func (cc *CascadeCloud) Initialize(clientBuilder controller.ControllerClientBuilder) {}
1274
++
1275
++// Instances returns an implementation of Instances for Cascade Controller.
1276
++func (cc *CascadeCloud) Instances() (cloudprovider.Instances, bool) {
1277
++	return cc, true
1278
++}
1279
++
1280
++func (cc *CascadeCloud) Clusters() (cloudprovider.Clusters, bool) {
1281
++	return nil, true
1282
++}
1283
++
1284
++// ProviderName returns the cloud provider ID.
1285
++func (cc *CascadeCloud) ProviderName() string {
1286
++	return ProviderName
1287
++}
1288
++
1289
++// LoadBalancer returns an implementation of LoadBalancer for Cascade Controller.
1290
++func (cc *CascadeCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) {
1291
++	return cc, true
1292
++}
1293
++
1294
++// Zones returns an implementation of Zones for Cascade Controller.
1295
++func (cc *CascadeCloud) Zones() (cloudprovider.Zones, bool) {
1296
++	return cc, true
1297
++}
1298
++
1299
++func (cc *CascadeCloud) GetZone(ctx context.Context) (cloudprovider.Zone, error) {
1300
++	return cloudprovider.Zone{
1301
++		Region:        cc.cfg.Global.Region,
1302
++		FailureDomain: cc.cfg.Global.Zone,
1303
++	}, nil
1304
++}
1305
++
1306
++// GetZoneByProviderID implements Zones.GetZoneByProviderID
1307
++// This is particularly useful in external cloud providers where the kubelet
1308
++// does not initialize node data.
1309
++func (cc *CascadeCloud) GetZoneByProviderID(ctx context.Context, providerID string) (cloudprovider.Zone, error) {
1310
++	return cloudprovider.Zone{}, errors.New("unimplemented")
1311
++}
1312
++
1313
++// GetZoneByNodeName implements Zones.GetZoneByNodeName
1314
++// This is particularly useful in external cloud providers where the kubelet
1315
++// does not initialize node data.
1316
++func (cc *CascadeCloud) GetZoneByNodeName(ctx context.Context, nodeName k8stypes.NodeName) (cloudprovider.Zone, error) {
1317
++	return cloudprovider.Zone{}, errors.New("unimeplemented")
1318
++}
1319
++
1320
++// Routes returns a false since the interface is not supported for Cascade controller.
1321
++func (cc *CascadeCloud) Routes() (cloudprovider.Routes, bool) {
1322
++	return nil, false
1323
++}
1324
++
1325
++// ScrubDNS filters DNS settings for pods.
1326
++func (cc *CascadeCloud) ScrubDNS(nameservers, searches []string) (nsOut, srchOut []string) {
1327
++	return nameservers, searches
1328
++}
1329
++
1330
++// HasClusterID returns true if the cluster has a clusterID
1331
++func (cc *CascadeCloud) HasClusterID() bool {
1332
++	return true
1333
++}
1334
+diff --git a/pkg/cloudprovider/providers/cascade/cascade_disks.go b/pkg/cloudprovider/providers/cascade/cascade_disks.go
1335
+new file mode 100644
1336
+index 0000000..e889a28
1337
+--- /dev/null
1338
+@@ -0,0 +1,253 @@
1339
++package cascade
1340
++
1341
++import (
1342
++	"context"
1343
++	"fmt"
1344
++	"github.com/golang/glog"
1345
++	k8stypes "k8s.io/apimachinery/pkg/types"
1346
++	"k8s.io/apimachinery/pkg/util/sets"
1347
++	"k8s.io/kubernetes/pkg/kubelet/apis"
1348
++	"k8s.io/kubernetes/pkg/volume"
1349
++	volumeutil "k8s.io/kubernetes/pkg/volume/util"
1350
++)
1351
++
1352
++// Attaches given virtual disk volume to the node running kubelet.
1353
++func (cc *CascadeCloud) AttachDisk(diskID string, nodeName k8stypes.NodeName) (string, error) {
1354
++	// Check if disk is already attached to that node.
1355
++	attached, err := cc.DiskIsAttached(diskID, nodeName)
1356
++	if err != nil {
1357
++		glog.Errorf("VKE Cloud Provider: cc.DiskIsAttached failed during AttachDisk. Error[%v]", err)
1358
++		return "", err
1359
++	}
1360
++
1361
++	// If not already attached, attach the disk.
1362
++	if !attached {
1363
++		operation := &VMDiskOperation{
1364
++			DiskID: StringPtr(diskID),
1365
++		}
1366
++
1367
++		vmID, err := cc.InstanceID(context.TODO(), nodeName)
1368
++		if err != nil {
1369
++			glog.Errorf("VKE Cloud Provider: cc.InstanceID failed for AttachDisk. Error[%v]", err)
1370
++			return "", err
1371
++		}
1372
++
1373
++		task, err := cc.apiClient.AttachDisk(vmID, operation)
1374
++		if err != nil {
1375
++			glog.Errorf("VKE Cloud Provider: Failed to attach disk with ID %s. Error[%v]", diskID, err)
1376
++			return "", err
1377
++		}
1378
++
1379
++		_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1380
++		if err != nil {
1381
++			glog.Errorf("VKE Cloud Provider: Failed to wait for task to attach disk with ID %s. Error[%v]",
1382
++				diskID, err)
1383
++			return "", err
1384
++		}
1385
++	}
1386
++
1387
++	// Get mount device of the attached disk.
1388
++	disk, err := cc.apiClient.GetDisk(diskID)
1389
++	if err != nil {
1390
++		glog.Errorf("VKE Cloud Provider: Failed to Get disk with diskID %s. Error[%v]", diskID, err)
1391
++		return "", err
1392
++	}
1393
++
1394
++	return disk.MountDevice, nil
1395
++}
1396
++
1397
++// Detaches given virtual disk volume from the node running kubelet.
1398
++func (cc *CascadeCloud) DetachDisk(diskID string, nodeName k8stypes.NodeName) error {
1399
++	operation := &VMDiskOperation{
1400
++		DiskID: StringPtr(diskID),
1401
++	}
1402
++
1403
++	vmID, err := cc.InstanceID(context.TODO(), nodeName)
1404
++	if err != nil {
1405
++		glog.Errorf("VKE Cloud Provider: cc.InstanceID failed for DetachDisk. Error[%v]", err)
1406
++		return err
1407
++	}
1408
++
1409
++	task, err := cc.apiClient.DetachDisk(vmID, operation)
1410
++	if err != nil {
1411
++		glog.Errorf("VKE Cloud Provider: Failed to detach disk with pdID %s. Error[%v]", diskID, err)
1412
++		return err
1413
++	}
1414
++
1415
++	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1416
++	if err != nil {
1417
++		glog.Errorf("VKE Cloud Provider: Failed to wait for task to detach disk with pdID %s. Error[%v]",
1418
++			diskID, err)
1419
++		return err
1420
++	}
1421
++
1422
++	return nil
1423
++}
1424
++
1425
++// DiskIsAttached returns if disk is attached to the VM using controllers supported by the plugin.
1426
++func (cc *CascadeCloud) DiskIsAttached(diskID string, nodeName k8stypes.NodeName) (bool, error) {
1427
++	vmID, err := cc.InstanceID(context.TODO(), nodeName)
1428
++	if err != nil {
1429
++		glog.Errorf("VKE Cloud Provider: cc.InstanceID failed for DiskIsAttached. Error[%v]", err)
1430
++		return false, err
1431
++	}
1432
++
1433
++	_, err = cc.apiClient.GetVM(vmID)
1434
++	if err != nil {
1435
++		switch err.(type) {
1436
++		case APIError:
1437
++			if err.(APIError).ErrorCode == VMNotFoundError {
1438
++				// If instance no longer exists, we will assume that the volume is not attached.
1439
++				glog.Warningf("VKE Cloud Provider: Instance %s does not exist. DiskIsAttached will assume"+
1440
++					" disk %s is not attached to it.", nodeName, diskID)
1441
++				return false, nil
1442
++			}
1443
++		}
1444
++		return false, err
1445
++	}
1446
++
1447
++	disk, err := cc.apiClient.GetDisk(diskID)
1448
++	if err != nil {
1449
++		glog.Errorf("VKE Cloud Provider: Failed to Get disk with diskID %s. Error[%v]", diskID, err)
1450
++		return false, err
1451
++	}
1452
++
1453
++	if disk.VM == vmID && StringVal(disk.State) == DiskStateAttached {
1454
++		return true, nil
1455
++	}
1456
++
1457
++	return false, nil
1458
++}
1459
++
1460
++// DisksAreAttached returns if disks are attached to the VM using controllers supported by the plugin.
1461
++func (cc *CascadeCloud) DisksAreAttached(diskIDs []string, nodeName k8stypes.NodeName) (map[string]bool, error) {
1462
++	attached := make(map[string]bool)
1463
++	for _, diskID := range diskIDs {
1464
++		attached[diskID] = false
1465
++	}
1466
++
1467
++	vmID, err := cc.InstanceID(context.TODO(), nodeName)
1468
++	if err != nil {
1469
++		glog.Errorf("VKE Cloud Provider: cc.InstanceID failed for DiskIsAttached. Error[%v]", err)
1470
++		return attached, err
1471
++	}
1472
++
1473
++	for _, diskID := range diskIDs {
1474
++		disk, err := cc.apiClient.GetDisk(diskID)
1475
++		if err != nil {
1476
++			glog.Warningf("VKE Cloud Provider: failed to get VMs for persistent disk %s, err [%v]",
1477
++				diskID, err)
1478
++		} else {
1479
++			if disk.VM == vmID && StringVal(disk.State) == DiskStateAttached {
1480
++				attached[diskID] = true
1481
++			}
1482
++		}
1483
++	}
1484
++
1485
++	return attached, nil
1486
++}
1487
++
1488
++// Create a volume of given size (in GB).
1489
++func (cc *CascadeCloud) CreateDisk(volumeOptions *VolumeOptions) (diskID string, err error) {
1490
++	// Get Zones for the cluster
1491
++	zones, err := cc.apiClient.GetZones()
1492
++	if err != nil {
1493
++		glog.Errorf("VKE Cloud Provider: Failed to Get zones for the cluster. Error[%v]", err)
1494
++		return "", err
1495
++	}
1496
++
1497
++	// Pick a zone to place the disk in.
1498
++	zoneSet := sets.NewString()
1499
++	for _, zone := range zones {
1500
++		zoneSet.Insert(zone)
1501
++	}
1502
++	var zone string
1503
++	if !volumeOptions.ZonePresent && !volumeOptions.ZonesPresent {
1504
++		zone = volumeutil.ChooseZoneForVolume(zoneSet, volumeOptions.Name)
1505
++	}
1506
++	if !volumeOptions.ZonePresent && volumeOptions.ZonesPresent {
1507
++		userZoneSet, err := volumeutil.ZonesToSet(volumeOptions.AvailabilityZones)
1508
++		if err != nil {
1509
++			return "", err
1510
++		}
1511
++		if !zoneSet.IsSuperset(userZoneSet) {
1512
++			return "", fmt.Errorf("VKE Cloud Provider: Zones '%s' is invalid. "+
1513
++				"Please use one or more of the following zones: %v", volumeOptions.AvailabilityZones, zoneSet.List())
1514
++		}
1515
++		zone = volumeutil.ChooseZoneForVolume(userZoneSet, volumeOptions.Name)
1516
++	}
1517
++	if volumeOptions.ZonePresent && !volumeOptions.ZonesPresent {
1518
++		if err := volumeutil.ValidateZone(volumeOptions.AvailabilityZone); err != nil {
1519
++			return "", err
1520
++		}
1521
++		if !zoneSet.Has(volumeOptions.AvailabilityZone) {
1522
++			return "", fmt.Errorf("VKE Cloud Provider: Zone '%s' is invalid. "+
1523
++				"Please use one of the following zones: %v", volumeOptions.AvailabilityZone, zoneSet.List())
1524
++		}
1525
++		zone = volumeOptions.AvailabilityZone
1526
++	}
1527
++
1528
++	diskSpec := DiskCreateSpec{}
1529
++	diskSpec.Name = StringPtr(volumeOptions.Name)
1530
++	diskSpec.Flavor = StringPtr(volumeOptions.Type)
1531
++	diskSpec.CapacityGB = Int32Ptr(int32(volumeOptions.CapacityGB))
1532
++	diskSpec.Kind = StringPtr(DiskSpecKind)
1533
++	diskSpec.Zone = StringPtr(zone)
1534
++	diskSpec.Encrypted = BoolPtr(volumeOptions.Encrypted)
1535
++
1536
++	task, err := cc.apiClient.CreateDisk(&diskSpec)
1537
++	if err != nil {
1538
++		glog.Errorf("VKE Cloud Provider: Failed to CreateDisk. Error[%v]", err)
1539
++		return "", err
1540
++	}
1541
++
1542
++	waitTask, err := cc.apiClient.WaitForTask(StringVal(task.ID))
1543
++	if err != nil {
1544
++		glog.Errorf("VKE Cloud Provider: Failed to wait for task to CreateDisk. Error[%v]", err)
1545
++		return "", err
1546
++	}
1547
++
1548
++	return StringVal(waitTask.Entity.ID), nil
1549
++}
1550
++
1551
++// Deletes a volume given volume name.
1552
++func (cc *CascadeCloud) DeleteDisk(diskID string) error {
1553
++	task, err := cc.apiClient.DeleteDisk(diskID)
1554
++	if err != nil {
1555
++		glog.Errorf("VKE Cloud Provider: Failed to DeleteDisk. Error[%v]", err)
1556
++		// If we get a DiskNotFound error, we assume that the disk is already deleted. So we don't return an error here.
1557
++		switch err.(type) {
1558
++		case APIError:
1559
++			if err.(APIError).ErrorCode == DiskNotFoundError {
1560
++				return nil
1561
++			}
1562
++			if err.(APIError).ErrorCode == DiskInUseError {
1563
++				return volume.NewDeletedVolumeInUseError(err.Error())
1564
++			}
1565
++		}
1566
++		return err
1567
++	}
1568
++
1569
++	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1570
++	if err != nil {
1571
++		glog.Errorf("VKE Cloud Provider: Failed to wait for task to DeleteDisk. Error[%v]", err)
1572
++		return err
1573
++	}
1574
++
1575
++	return nil
1576
++}
1577
++
1578
++// Gets the zone and region for the volume.
1579
++func (cc *CascadeCloud) GetVolumeLabels(diskID string) (map[string]string, error) {
1580
++	disk, err := cc.apiClient.GetDisk(diskID)
1581
++	if err != nil {
1582
++		glog.Errorf("VKE Cloud Provider: Failed to GetDisk for GetVolumeLabels. Error[%v]", err)
1583
++		return nil, err
1584
++	}
1585
++
1586
++	labels := make(map[string]string)
1587
++	labels[apis.LabelZoneFailureDomain] = StringVal(disk.Zone)
1588
++	labels[apis.LabelZoneRegion] = cc.cfg.Global.Region
1589
++
1590
++	return labels, nil
1591
++}
1592
+diff --git a/pkg/cloudprovider/providers/cascade/cascade_instances.go b/pkg/cloudprovider/providers/cascade/cascade_instances.go
1593
+new file mode 100644
1594
+index 0000000..9f3f17c
1595
+--- /dev/null
1596
+@@ -0,0 +1,133 @@
1597
++package cascade
1598
++
1599
++import (
1600
++	"context"
1601
++	"errors"
1602
++	"github.com/golang/glog"
1603
++	"os"
1604
++	"strings"
1605
++
1606
++	"k8s.io/api/core/v1"
1607
++	k8stypes "k8s.io/apimachinery/pkg/types"
1608
++	"k8s.io/kubernetes/pkg/cloudprovider"
1609
++)
1610
++
1611
++// NodeAddresses is an implementation of Instances.NodeAddresses. In the future, private IP address, external IP, etc.
1612
++// will be added based on need.
1613
++func (cc *CascadeCloud) NodeAddresses(ctx context.Context, nodeName k8stypes.NodeName) ([]v1.NodeAddress, error) {
1614
++	return []v1.NodeAddress{
1615
++		{Type: v1.NodeInternalIP, Address: cc.cfg.Global.IPAddress},
1616
++		{Type: v1.NodeInternalDNS, Address: cc.cfg.Global.DNSName},
1617
++	}, nil
1618
++}
1619
++
1620
++// NodeAddressesByProviderID returns the node addresses of an instances with the specified unique providerID
1621
++// This method will not be called from the node that is requesting this ID. i.e. metadata service
1622
++// and other local methods cannot be used here
1623
++func (cc *CascadeCloud) NodeAddressesByProviderID(ctx context.Context, providerID string) ([]v1.NodeAddress, error) {
1624
++	// Get the name of the VM using the ID and generate the DNS name based on the VM name.
1625
++	vm, err := cc.apiClient.GetVM(providerID)
1626
++	if err != nil {
1627
++		return nil, err
1628
++	}
1629
++	// Get the DNS name for the master VM and replace the VM name portion with the requested VM name.
1630
++	dnsNameParts := strings.SplitN(cc.cfg.Global.DNSName, ".", 2)
1631
++	if len(dnsNameParts) != 2 {
1632
++		return nil, errors.New("Cascade cloud provider: Invalid DNS name specified in the configuation. " +
1633
++			"Cannot get NodeAddressByProviderID.")
1634
++	}
1635
++	dnsAddress := StringVal(vm.Name) + dnsNameParts[1]
1636
++	addresses := []v1.NodeAddress{}
1637
++	addresses = append(addresses, v1.NodeAddress{Type: v1.NodeInternalDNS, Address: dnsAddress})
1638
++	return addresses, nil
1639
++}
1640
++
1641
++func (cc *CascadeCloud) AddSSHKeyToAllInstances(ctx context.Context, user string, keyData []byte) error {
1642
++	return errors.New("unimplemented")
1643
++}
1644
++
1645
++// Current node name returns node name based on host name. For Cascade Kubernetes nodes, we will use host name as the
1646
++// node name.
1647
++func (cc *CascadeCloud) CurrentNodeName(ctx context.Context, hostname string) (k8stypes.NodeName, error) {
1648
++	cc.localK8sHostname = hostname
1649
++	return k8stypes.NodeName(hostname), nil
1650
++}
1651
++
1652
++// ExternalID returns the cloud provider ID of the specified instance (deprecated).
1653
++// Note: We call Cascade Controller here to check if the instance is alive or not. That check is used by Kubernetes
1654
++// to proactively remove nodes that the cloud provider believes is no longer available. Even otherwise, Kubernetes
1655
++// will remove those nodes eventually.
1656
++
1657
++func (cc *CascadeCloud) ExternalID(ctx context.Context, nodeName k8stypes.NodeName) (string, error) {
1658
++	return getInstanceIDAndLivelinessFromNodeName(cc, nodeName)
1659
++}
1660
++
1661
++// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running.
1662
++// If false is returned with no error, the instance will be immediately deleted by the cloud controller manager.
1663
++func (cc *CascadeCloud) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
1664
++	return false, errors.New("unimplemented")
1665
++}
1666
++
1667
++// InstanceID returns the cloud provider ID of the specified instance.
1668
++// Note: We call Cascade Controller here to check if the instance is alive or not. That check is used by Kubernetes
1669
++// to proactively remove nodes that the cloud provider believes is no longer available.
1670
++func (cc *CascadeCloud) InstanceID(ctx context.Context, nodeName k8stypes.NodeName) (string, error) {
1671
++	return getInstanceIDAndLivelinessFromNodeName(cc, nodeName)
1672
++}
1673
++
1674
++// This gets the Cascade VM ID from the Kubernetes node name.
1675
++func getInstanceIDFromNodeName(nodeName k8stypes.NodeName) (string, error) {
1676
++	// nodeName is of the format master-instance-id or worker-instance-id. To compute the instance ID, we need to just
1677
++	// get the portion after master- or worker-. That is what we do below.
1678
++	nodeParts := strings.SplitN(string(nodeName), "-", 2)
1679
++	if len(nodeParts) != 2 {
1680
++		return "", errors.New("Cascade cloud provider: Invalid node name. Cannot fetch instance ID.")
1681
++	}
1682
++	return nodeParts[1], nil
1683
++}
1684
++
1685
++// This gets the Cascade VM ID and its liveliness from the Kubernetes node name.
1686
++func getInstanceIDAndLivelinessFromNodeName(cc *CascadeCloud, nodeName k8stypes.NodeName) (string, error) {
1687
++	instanceID, err := getInstanceIDFromNodeName(nodeName)
1688
++	if err != nil {
1689
++		return "", err
1690
++	}
1691
++	// Get local hostname. We need to do this check to make sure we call VKE controller only from master nodes
1692
++	// because worker nodes cannot login to VKE controller.
1693
++	hostname, err := os.Hostname()
1694
++	if err != nil {
1695
++		glog.Errorf("Cascade Cloud Provider: get hostname failed. Error[%v]", err)
1696
++		return "", err
1697
++	}
1698
++	// Note: Kubelet running on the worker node do not need to call VKE.
1699
++	if strings.HasPrefix(hostname, MasterPrefix) {
1700
++		_, err := cc.apiClient.GetVM(instanceID)
1701
++		if err != nil {
1702
++			switch err.(type) {
1703
++			case APIError:
1704
++				if err.(APIError).ErrorCode == VMNotFoundError {
1705
++					// If instance no longer exists, we will return instance not found error
1706
++					glog.Warningf("Cascade Cloud Provider: VM %s does not exist", instanceID)
1707
++					return "", cloudprovider.InstanceNotFound
1708
++				}
1709
++			}
1710
++		}
1711
++	}
1712
++	return instanceID, nil
1713
++}
1714
++
1715
++// InstanceTypeByProviderID returns the cloudprovider instance type of the node with the specified unique providerID
1716
++// This method will not be called from the node that is requesting this ID. i.e. metadata service
1717
++// and other local methods cannot be used here
1718
++func (cc *CascadeCloud) InstanceTypeByProviderID(ctx context.Context, providerID string) (string, error) {
1719
++	return "", errors.New("unimplemented")
1720
++}
1721
++
1722
++func (cc *CascadeCloud) InstanceType(ctx context.Context, nodeName k8stypes.NodeName) (string, error) {
1723
++	return "", nil
1724
++}
1725
++
1726
++// InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes
1727
++func (cc *CascadeCloud) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) {
1728
++	return false, cloudprovider.NotImplemented
1729
++}
1730
+diff --git a/pkg/cloudprovider/providers/cascade/cascade_instances_test.go b/pkg/cloudprovider/providers/cascade/cascade_instances_test.go
1731
+new file mode 100644
1732
+index 0000000..8fb314d
1733
+--- /dev/null
1734
+@@ -0,0 +1,44 @@
1735
++package cascade
1736
++
1737
++import (
1738
++	"context"
1739
++	"strings"
1740
++	"testing"
1741
++
1742
++	"github.com/stretchr/testify/assert"
1743
++	"k8s.io/api/core/v1"
1744
++)
1745
++
1746
++const configFile = `
1747
++[Global]
1748
++target = target
1749
++tenantName = tenant
1750
++clusterID = cluster-id
1751
++authEndpoint = auth-endpoint
1752
++domainName = domain.test
1753
++dnsName = node.domain.test
1754
++region = region
1755
++zone = zone
1756
++ipAddress = 1.1.1.1
1757
++`
1758
++
1759
++func getCascadeInstance() (*CascadeCloud, error) {
1760
++	cfg, err := readConfig(strings.NewReader(configFile))
1761
++	return &CascadeCloud{
1762
++		cfg:              cfg,
1763
++		localHostname:    "hostname",
1764
++		localK8sHostname: "",
1765
++	}, err
1766
++}
1767
++
1768
++func TestNodeAddresses(t *testing.T) {
1769
++	cc, err := getCascadeInstance()
1770
++	assert.Nil(t, err)
1771
++	expectedNodeAddresses := []v1.NodeAddress{
1772
++		{Type: v1.NodeInternalIP, Address: "1.1.1.1"},
1773
++		{Type: v1.NodeInternalDNS, Address: "node.domain.test"},
1774
++	}
1775
++	actualNodeAddresses, err := cc.NodeAddresses(context.TODO(), "node")
1776
++	assert.Nil(t, err)
1777
++	assert.Equal(t, expectedNodeAddresses, actualNodeAddresses)
1778
++}
1779
+diff --git a/pkg/cloudprovider/providers/cascade/cascade_loadbalancer.go b/pkg/cloudprovider/providers/cascade/cascade_loadbalancer.go
1780
+new file mode 100644
1781
+index 0000000..fc4b19e
1782
+--- /dev/null
1783
+@@ -0,0 +1,301 @@
1784
++package cascade
1785
++
1786
++import (
1787
++	"context"
1788
++	"fmt"
1789
++	"github.com/golang/glog"
1790
++	"k8s.io/api/core/v1"
1791
++	"k8s.io/apimachinery/pkg/types"
1792
++	"k8s.io/kubernetes/pkg/api/v1/service"
1793
++	"k8s.io/kubernetes/pkg/cloudprovider"
1794
++)
1795
++
1796
++const TCP_PROTOCOL = "TCP"
1797
++
1798
++const HTTP_PROTOCOL = "HTTP"
1799
++
1800
++const ServiceAnnotationLoadBalancerInternal = "service.beta.kubernetes.io/vke-load-balancer-internal"
1801
++
1802
++// EnsureLoadBalancer creates or updates a Cascade load balancer
1803
++func (cc *CascadeCloud) EnsureLoadBalancer(ctx context.Context, clusterName string, k8sService *v1.Service, nodes []*v1.Node) (*v1.LoadBalancerStatus, error) {
1804
++	logger := newLoadBalancerLogger(clusterName, k8sService, "EnsureLoadBalancer")
1805
++
1806
++	loadBalancerName := cc.GetLoadBalancerName(ctx, clusterName, k8sService)
1807
++	logger.Infof("Load balancer name: %s", loadBalancerName)
1808
++
1809
++	// Sanity checks
1810
++	if k8sService.Spec.SessionAffinity != v1.ServiceAffinityNone {
1811
++		logger.Errorf("Unsupported load balancer session affinity: %+v", k8sService.Spec.SessionAffinity)
1812
++		return nil, fmt.Errorf("Unsupported load balancer session affinity: %+v", k8sService.Spec.SessionAffinity)
1813
++	}
1814
++
1815
++	if len(k8sService.Spec.Ports) == 0 {
1816
++		logger.Errorf("No port mapping is specified")
1817
++		return nil, fmt.Errorf("No port mapping is specified")
1818
++	}
1819
++
1820
++	// Create load balancer port maps
1821
++	portMaps := []*LoadBalancerPortMap{}
1822
++	for _, port := range k8sService.Spec.Ports {
1823
++		if port.Protocol != v1.ProtocolTCP {
1824
++			logger.Warningf("Ignoring port that does not use TCP protocol: %+v", port)
1825
++			continue
1826
++		}
1827
++
1828
++		if port.NodePort == 0 {
1829
++			logger.Warningf("Ignoring port without node port defined: %+v", port)
1830
++			continue
1831
++		}
1832
++
1833
++		// TODO: For now we only support SSL pass through. All port mappings are using TCP protocol.
1834
++		//       Also note that we allow all external traffic to access the ports.
1835
++		portMap := &LoadBalancerPortMap{
1836
++			InstancePort:         Int64Ptr(int64(port.NodePort)),
1837
++			InstanceProtocol:     StringPtr(TCP_PROTOCOL),
1838
++			LoadBalancerPort:     Int64Ptr(int64(port.Port)),
1839
++			LoadBalancerProtocol: StringPtr(TCP_PROTOCOL),
1840
++		}
1841
++		portMaps = append(portMaps, portMap)
1842
++	}
1843
++
1844
++	// Create load balancer health check
1845
++	healthCheck := &LoadBalancerHealthCheck{
1846
++		HealthyThreshold:  5,
1847
++		IntervalInSeconds: 10,
1848
++	}
1849
++	if healthCheckPath, healthCheckNodePort := service.GetServiceHealthCheckPathPort(k8sService); healthCheckPath != "" {
1850
++		logger.Infof("HTTP health checks on: %s:%d", healthCheckPath, healthCheckNodePort)
1851
++		healthCheck.Path = StringPtr(healthCheckPath)
1852
++		healthCheck.Port = Int64Ptr(int64(healthCheckNodePort))
1853
++		healthCheck.Protocol = StringPtr(HTTP_PROTOCOL)
1854
++	} else {
1855
++		logger.Infof("TCP health check on port: %d", Int64Val(portMaps[0].InstancePort))
1856
++		healthCheck.Port = portMaps[0].InstancePort
1857
++		healthCheck.Protocol = StringPtr(TCP_PROTOCOL)
1858
++	}
1859
++
1860
++	// Create load balancer
1861
++	createSpec := &LoadBalancerCreateSpec{
1862
++		Name:        StringPtr(loadBalancerName),
1863
++		Type:        StringPtr(getLoadBalancerType(k8sService)),
1864
++		PortMaps:    portMaps,
1865
++		HealthCheck: healthCheck,
1866
++		SubDomain:   StringPtr(k8sService.Name),
1867
++	}
1868
++	logger.Infof("Load balancer create spec: %+v", *createSpec)
1869
++
1870
++	task, err := cc.apiClient.CreateOrUpdateLoadBalancer(createSpec)
1871
++	if err != nil {
1872
++		logger.Errorf("Failed to create or update load balancer. Error: [%v]", err)
1873
++		return nil, err
1874
++	}
1875
++
1876
++	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1877
++	if err != nil {
1878
++		logger.Errorf("Failed to poll task status of creating or updating load balancer. Error: [%v]", err)
1879
++		return nil, err
1880
++	}
1881
++
1882
++	// Apply VM update to load balancer
1883
++	err = cc.updateLoadBalancerVMs(nodes, loadBalancerName, logger)
1884
++	if err != nil {
1885
++		// The private function already did logging. No need to log again.
1886
++		return nil, err
1887
++	}
1888
++
1889
++	// Get load balancer
1890
++	loadBalancer, err := cc.apiClient.GetLoadBalancer(StringPtr(loadBalancerName))
1891
++	if err != nil {
1892
++		glog.Errorf("Failed to get load balancer. Error: [%v]", err)
1893
++		return nil, err
1894
++	}
1895
++
1896
++	return toLoadBalancerStatus(loadBalancer), nil
1897
++}
1898
++
1899
++// GetLoadBalancerName returns the LoadBalancer name.
1900
++func (cc *CascadeCloud) GetLoadBalancerName(ctx context.Context, clusterName string, k8sService *v1.Service) string {
1901
++	// TODO: replace DefaultLoadBalancerName to generate more meaningful loadbalancer names.
1902
++	return cloudprovider.DefaultLoadBalancerName(k8sService)
1903
++}
1904
++
1905
++// GetLoadBalancer returns the information about a Cascade load balancer
1906
++func (cc *CascadeCloud) GetLoadBalancer(ctx context.Context, clusterName string, k8sService *v1.Service) (*v1.LoadBalancerStatus, bool, error) {
1907
++	logger := newLoadBalancerLogger(clusterName, k8sService, "GetLoadBalancer")
1908
++
1909
++	loadBalancerName := cc.GetLoadBalancerName(ctx, clusterName, k8sService)
1910
++	logger.Infof("Load balancer name: %s", loadBalancerName)
1911
++
1912
++	// Get load balancer
1913
++	loadBalancer, err := cc.apiClient.GetLoadBalancer(StringPtr(loadBalancerName))
1914
++	if err != nil {
1915
++		logger.Errorf("Failed to get load balancer. Error: [%v]", err)
1916
++		// Do not return error here because we want the caller of this function to determine
1917
++		// what to do with the not-found situation.
1918
++		switch err.(type) {
1919
++		case APIError:
1920
++			if err.(APIError).ErrorCode == NotFoundError {
1921
++				return nil, false, nil
1922
++			}
1923
++		}
1924
++		return nil, false, err
1925
++	}
1926
++
1927
++	return toLoadBalancerStatus(loadBalancer), true, nil
1928
++}
1929
++
1930
++// UpdateLoadBalancer updates the node information of a Cascade load balancer
1931
++func (cc *CascadeCloud) UpdateLoadBalancer(ctx context.Context, clusterName string, k8sService *v1.Service, nodes []*v1.Node) error {
1932
++	logger := newLoadBalancerLogger(clusterName, k8sService, "UpdateLoadBalancer")
1933
++
1934
++	loadBalancerName := cc.GetLoadBalancerName(ctx, clusterName, k8sService)
1935
++	logger.Infof("Load balancer name: %s", loadBalancerName)
1936
++
1937
++	err := cc.updateLoadBalancerVMs(nodes, loadBalancerName, logger)
1938
++	if err != nil {
1939
++		// The private function already did logging. No need to log again.
1940
++		return err
1941
++	}
1942
++
1943
++	return nil
1944
++}
1945
++
1946
++// EnsureLoadBalancerDeleted deletes a Cascade load balancer
1947
++func (cc *CascadeCloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName string, k8sService *v1.Service) error {
1948
++	logger := newLoadBalancerLogger(clusterName, k8sService, "EnsureLoadBalancerDeleted")
1949
++
1950
++	loadBalancerName := cc.GetLoadBalancerName(ctx, clusterName, k8sService)
1951
++	logger.Infof("Load balancer name: %s", loadBalancerName)
1952
++
1953
++	task, err := cc.apiClient.DeleteLoadBalancer(StringPtr(loadBalancerName), k8sService.Name)
1954
++	if err != nil {
1955
++		logger.Errorf("Failed to delete load balancer. Error: [%v]", err)
1956
++		// If we get a NotFound error, we assume that the load balancer is already deleted. So we don't return an error
1957
++		// here.
1958
++		switch err.(type) {
1959
++		case APIError:
1960
++			if err.(APIError).ErrorCode == NotFoundError {
1961
++				return nil
1962
++			}
1963
++		}
1964
++		return err
1965
++	}
1966
++
1967
++	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
1968
++	if err != nil {
1969
++		logger.Errorf("Failed to poll task status of deleting load balancer. Error: [%v]", err)
1970
++		return err
1971
++	}
1972
++
1973
++	return nil
1974
++}
1975
++
1976
++func (cc *CascadeCloud) updateLoadBalancerVMs(
1977
++	nodes []*v1.Node, loadBalancerName string, logger *loadBalancerLogger) error {
1978
++
1979
++	// Apply VM update to the load balancer
1980
++	loadBalancerVMs := make([]*LoadBalancerVM, 0)
1981
++
1982
++	for _, node := range nodes {
1983
++		// If the node does not have a name, we cannot derive its instance ID. Therefore we skip this node.
1984
++		if len(node.Name) == 0 {
1985
++			logger.Warningf("Node %s does not have a name. Skip updating this VM for load balancer", node.UID)
1986
++			continue
1987
++		}
1988
++
1989
++		// If we cannot get the instance ID, something is wrong on the Cascade Controller side.
1990
++		// However, we should tolerate such failure and continue the load balancer VM update
1991
++		// by skipping this VM.
1992
++		instanceID, err := cc.InstanceID(context.TODO(), types.NodeName(node.Name))
1993
++		if err != nil {
1994
++			logger.Warningf("Unable to get instance ID for node %s, skip updating this VM for load balancer. Error [%v]", node.Name, err)
1995
++			continue
1996
++		}
1997
++
1998
++		loadBalancerVMs = append(loadBalancerVMs, &LoadBalancerVM{
1999
++			ID: StringPtr(instanceID),
2000
++		})
2001
++	}
2002
++
2003
++	if len(loadBalancerVMs) == 0 {
2004
++		logger.Infof("No nodes to be added to the load balancer. Skip updating load balancer VMs")
2005
++		return nil
2006
++	}
2007
++
2008
++	vmUpdate := &LoadBalancerVMUpdate{
2009
++		VMIds: loadBalancerVMs,
2010
++	}
2011
++	logger.Infof("Load balancer VM update spec: %+v", vmUpdate.VMIds)
2012
++
2013
++	task, err := cc.apiClient.ApplyVMsToLoadBalancer(StringPtr(loadBalancerName), vmUpdate)
2014
++	if err != nil {
2015
++		logger.Errorf("Failed to update load balancer VMs. Error: [%v]", err)
2016
++		return err
2017
++	}
2018
++
2019
++	_, err = cc.apiClient.WaitForTask(StringVal(task.ID))
2020
++	if err != nil {
2021
++		logger.Errorf("Failed to poll task status of updating load balancer VMs. Error: [%v]", err)
2022
++		return err
2023
++	}
2024
++
2025
++	return nil
2026
++}
2027
++
2028
++func toLoadBalancerStatus(lb *LoadBalancer) *v1.LoadBalancerStatus {
2029
++	var endpoint string
2030
++	if lb != nil && lb.Endpoint != nil {
2031
++		endpoint = StringVal(lb.Endpoint)
2032
++	}
2033
++
2034
++	return &v1.LoadBalancerStatus{
2035
++		Ingress: []v1.LoadBalancerIngress{
2036
++			{
2037
++				Hostname: endpoint,
2038
++			},
2039
++		},
2040
++	}
2041
++}
2042
++
2043
++type loadBalancerLogger struct {
2044
++	clusterName string
2045
++	k8sService  *v1.Service
2046
++	callingFunc string
2047
++}
2048
++
2049
++func newLoadBalancerLogger(clusterName string, k8sService *v1.Service, callingFunc string) *loadBalancerLogger {
2050
++	return &loadBalancerLogger{
2051
++		clusterName: clusterName,
2052
++		k8sService:  k8sService,
2053
++		callingFunc: callingFunc,
2054
++	}
2055
++}
2056
++
2057
++func (l *loadBalancerLogger) getLogMsg(
2058
++	msgTemplate string, args ...interface{}) string {
2059
++
2060
++	errorMsg := fmt.Sprintf("Cascade Cloud Provider::%s::Cluster [%s] Service [%s]: %s",
2061
++		l.callingFunc, l.clusterName, l.k8sService.Name,
2062
++		msgTemplate)
2063
++	return fmt.Sprintf(errorMsg, args)
2064
++}
2065
++
2066
++func (l *loadBalancerLogger) Errorf(msgTemplate string, args ...interface{}) {
2067
++	glog.Errorln(l.getLogMsg(msgTemplate, args))
2068
++}
2069
++
2070
++func (l *loadBalancerLogger) Warningf(msgTemplate string, args ...interface{}) {
2071
++	glog.Warningln(l.getLogMsg(msgTemplate, args))
2072
++}
2073
++
2074
++func (l *loadBalancerLogger) Infof(msgTemplate string, args ...interface{}) {
2075
++	glog.Infoln(l.getLogMsg(msgTemplate, args))
2076
++}
2077
++
2078
++// Check if service requires an internal load balancer.
2079
++func getLoadBalancerType(service *v1.Service) string {
2080
++	if _, found := service.Annotations[ServiceAnnotationLoadBalancerInternal]; found {
2081
++		return "PRIVATE"
2082
++	}
2083
++	return "PUBLIC"
2084
++}
2085
+diff --git a/pkg/cloudprovider/providers/cascade/client.go b/pkg/cloudprovider/providers/cascade/client.go
2086
+new file mode 100644
2087
+index 0000000..400e377
2088
+--- /dev/null
2089
+@@ -0,0 +1,400 @@
2090
++package cascade
2091
++
2092
++import (
2093
++	"bytes"
2094
++	"crypto/tls"
2095
++	"crypto/x509"
2096
++	"encoding/json"
2097
++	"fmt"
2098
++	"github.com/golang/glog"
2099
++	"net/http"
2100
++	"strings"
2101
++	"time"
2102
++)
2103
++
2104
++// Represents stateless context needed to call Cascade APIs.
2105
++// Note that we are implementing the Cascade APIs manually instead of using the swagger generated code
2106
++// because swagger uses a different version of openapi library than kubernetes. It is difficult to
2107
++// address the version conflict to make it compile.
2108
++type Client struct {
2109
++	cfg        *ClientConfig
2110
++	options    ClientOptions
2111
++	restClient *restClient
2112
++}
2113
++
2114
++type ClientConfig struct {
2115
++	tenantName string
2116
++	clusterID  string
2117
++	region     string
2118
++	endpoint   string
2119
++}
2120
++
2121
++// Represents Tokens
2122
++type TokenOptions struct {
2123
++	AccessToken  string `json:"access_token"`
2124
++	ExpiresIn    int    `json:"expires_in"`
2125
++	RefreshToken string `json:"refresh_token,omitempty"`
2126
++	IDToken      string `json:"id_token"`
2127
++	TokenType    string `json:"token_type"`
2128
++}
2129
++
2130
++type TokenCallback func(string)
2131
++
2132
++// Options for Client
2133
++type ClientOptions struct {
2134
++	// When using the Tasks.Wait APIs, defines the duration of how long
2135
++	// we should continue to poll the server. Default is 30 minutes.
2136
++	// TasksAPI.WaitTimeout() can be used to specify timeout on
2137
++	// individual calls.
2138
++	TaskPollTimeout time.Duration
2139
++
2140
++	// Whether or not to ignore any TLS errors when talking to Cascade,
2141
++	// false by default.
2142
++	IgnoreCertificate bool
2143
++
2144
++	// List of root CA's to use for server validation
2145
++	// nil by default.
2146
++	RootCAs *x509.CertPool
2147
++
2148
++	// For tasks APIs, defines the number of retries to make in the event
2149
++	// of an error. Default is 3.
2150
++	TaskRetryCount int
2151
++
2152
++	// Tokens for user authentication. Default is empty.
2153
++	TokenOptions *TokenOptions
2154
++}
2155
++
2156
++const minimumTaskPollDelay = 500 * time.Millisecond
2157
++
2158
++// Creates a new Cascade client which can be used to make API calls to Cascade.
2159
++func NewClient(cfg *CascadeConfig, authClient *AuthClient) (c *Client, err error) {
2160
++	tokenOptions, err := authClient.GetTokensByMachineAccount()
2161
++	if err != nil {
2162
++		glog.Errorf("Cascade Cloud Provider: Failed to create new client due to error: %+v", err)
2163
++		return
2164
++	}
2165
++
2166
++	options := &ClientOptions{
2167
++		TaskPollTimeout:   30 * time.Minute,
2168
++		TaskRetryCount:    3,
2169
++		TokenOptions:      tokenOptions,
2170
++		IgnoreCertificate: false,
2171
++		RootCAs:           nil,
2172
++	}
2173
++
2174
++	tr := &http.Transport{
2175
++		TLSClientConfig: &tls.Config{
2176
++			InsecureSkipVerify: options.IgnoreCertificate,
2177
++			RootCAs:            options.RootCAs},
2178
++	}
2179
++
2180
++	tokenCallback := func(newToken string) {
2181
++		c.options.TokenOptions.AccessToken = newToken
2182
++	}
2183
++
2184
++	restClient := &restClient{
2185
++		authClient:                authClient,
2186
++		httpClient:                &http.Client{Transport: tr},
2187
++		UpdateAccessTokenCallback: tokenCallback,
2188
++	}
2189
++
2190
++	clientConfig := &ClientConfig{
2191
++		tenantName: cfg.Global.TenantName,
2192
++		clusterID:  cfg.Global.ClusterID,
2193
++		region:     cfg.Global.Region,
2194
++		endpoint:   strings.TrimRight(cfg.Global.CloudTarget, "/"),
2195
++	}
2196
++
2197
++	c = &Client{
2198
++		cfg:        clientConfig,
2199
++		restClient: restClient,
2200
++		// Ensure a copy of options is made, rather than using a pointer
2201
++		// which may change out from underneath if misused by the caller.
2202
++		options: *options,
2203
++	}
2204
++
2205
++	return
2206
++}
2207
++
2208
++// Gets VM with the specified ID.
2209
++func (api *Client) GetVM(vmID string) (vm *VM, err error) {
2210
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/vms/%s", api.cfg.endpoint, api.cfg.tenantName,
2211
++		api.cfg.clusterID, vmID)
2212
++	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2213
++	if err != nil {
2214
++		return
2215
++	}
2216
++	defer res.Body.Close()
2217
++	res, err = getError(res)
2218
++	if err != nil {
2219
++		return
2220
++	}
2221
++	vm = &VM{}
2222
++	err = json.NewDecoder(res.Body).Decode(vm)
2223
++	return
2224
++}
2225
++
2226
++// Gets disk with the specified ID.
2227
++func (api *Client) GetDisk(diskID string) (disk *PersistentDisk, err error) {
2228
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/disks/%s", api.cfg.endpoint, api.cfg.tenantName,
2229
++		api.cfg.clusterID, diskID)
2230
++	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2231
++	if err != nil {
2232
++		return
2233
++	}
2234
++	defer res.Body.Close()
2235
++	res, err = getError(res)
2236
++	if err != nil {
2237
++		return
2238
++	}
2239
++	disk = &PersistentDisk{}
2240
++	err = json.NewDecoder(res.Body).Decode(disk)
2241
++	return
2242
++}
2243
++
2244
++// Creates a disk under the cluster.
2245
++func (api *Client) CreateDisk(spec *DiskCreateSpec) (task *Task, err error) {
2246
++	body, err := json.Marshal(spec)
2247
++	if err != nil {
2248
++		return
2249
++	}
2250
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/disks", api.cfg.endpoint, api.cfg.tenantName,
2251
++		api.cfg.clusterID)
2252
++	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2253
++	if err != nil {
2254
++		return
2255
++	}
2256
++	defer res.Body.Close()
2257
++	task, err = getTask(getError(res))
2258
++	return
2259
++}
2260
++
2261
++// Deletes a disk with the specified ID.
2262
++func (api *Client) DeleteDisk(diskID string) (task *Task, err error) {
2263
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/disks/%s", api.cfg.endpoint, api.cfg.tenantName,
2264
++		api.cfg.clusterID, diskID)
2265
++	res, err := api.restClient.Delete(uri, api.options.TokenOptions)
2266
++	if err != nil {
2267
++		return
2268
++	}
2269
++	defer res.Body.Close()
2270
++	task, err = getTask(getError(res))
2271
++	return
2272
++}
2273
++
2274
++// Attaches a disk to the specified VM.
2275
++func (api *Client) AttachDisk(vmID string, op *VMDiskOperation) (task *Task, err error) {
2276
++	body, err := json.Marshal(op)
2277
++	if err != nil {
2278
++		return
2279
++	}
2280
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/vms/%s/attach_disk", api.cfg.endpoint, api.cfg.tenantName,
2281
++		api.cfg.clusterID, vmID)
2282
++	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2283
++	if err != nil {
2284
++		return
2285
++	}
2286
++	defer res.Body.Close()
2287
++	task, err = getTask(getError(res))
2288
++	return
2289
++}
2290
++
2291
++// Detaches a disk from the specified VM.
2292
++func (api *Client) DetachDisk(vmID string, op *VMDiskOperation) (task *Task, err error) {
2293
++	body, err := json.Marshal(op)
2294
++	if err != nil {
2295
++		return
2296
++	}
2297
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/vms/%s/detach_disk", api.cfg.endpoint, api.cfg.tenantName,
2298
++		api.cfg.clusterID, vmID)
2299
++	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2300
++	if err != nil {
2301
++		return
2302
++	}
2303
++	defer res.Body.Close()
2304
++	task, err = getTask(getError(res))
2305
++	return
2306
++}
2307
++
2308
++// Gets a task by ID.
2309
++func (api *Client) GetTask(taskID string) (task *Task, err error) {
2310
++	uri := fmt.Sprintf("%s/v1/tenants/%s/tasks/%s?region=%s", api.cfg.endpoint, api.cfg.tenantName,
2311
++		taskID, api.cfg.region)
2312
++	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2313
++	if err != nil {
2314
++		return
2315
++	}
2316
++	defer res.Body.Close()
2317
++	result, err := getTask(getError(res))
2318
++	return result, err
2319
++}
2320
++
2321
++// Waits for a task to complete by polling the tasks API until a task returns with the state COMPLETED or ERROR.
2322
++func (api *Client) WaitForTask(taskID string) (task *Task, err error) {
2323
++	start := time.Now()
2324
++	numErrors := 0
2325
++	maxErrors := api.options.TaskRetryCount
2326
++	backoffMultiplier := 1
2327
++
2328
++	for time.Since(start) < api.options.TaskPollTimeout {
2329
++		task, err = api.GetTask(taskID)
2330
++		if err != nil {
2331
++			switch err.(type) {
2332
++			// If an ApiError comes back, something is wrong, return the error to the caller
2333
++			case APIError:
2334
++				return
2335
++				// For other errors, retry before giving up
2336
++			default:
2337
++				numErrors++
2338
++				if numErrors > maxErrors {
2339
++					return
2340
++				}
2341
++			}
2342
++		} else {
2343
++			// Reset the error count any time a successful call is made
2344
++			numErrors = 0
2345
++			if StringVal(task.State) == "COMPLETED" {
2346
++				return
2347
++			}
2348
++			if StringVal(task.State) == "ERROR" {
2349
++				err = TaskError{StringVal(task.ID), getFailedStep(task)}
2350
++				return
2351
++			}
2352
++		}
2353
++
2354
++		// Perform backoff based on how long it has been since we started polling. The logic is as follows:
2355
++		// For the first 10 seconds, poll every 500 milliseconds.
2356
++		// From there till the first 1 minute, poll every 1 second.
2357
++		// From there till the first 10 minutes, poll every 5 seconds.
2358
++		// From there till the timeout (30 minutes), poll every 10 seconds.
2359
++		elapsedTime := time.Since(start)
2360
++		if elapsedTime > 10*time.Second && elapsedTime <= 60*time.Second {
2361
++			backoffMultiplier = 2
2362
++		} else if elapsedTime > 60*time.Second && elapsedTime <= 600*time.Second {
2363
++			backoffMultiplier = 10
2364
++		} else if elapsedTime > 600*time.Second && elapsedTime <= api.options.TaskPollTimeout {
2365
++			backoffMultiplier = 20
2366
++		}
2367
++		time.Sleep(time.Duration(backoffMultiplier) * minimumTaskPollDelay)
2368
++	}
2369
++	err = TaskTimeoutError{taskID}
2370
++	return
2371
++}
2372
++
2373
++// CreateOrUpdateLoadBalancer creates a load balancer if not existed, or update one otherwise
2374
++func (api *Client) CreateOrUpdateLoadBalancer(spec *LoadBalancerCreateSpec) (*Task, error) {
2375
++	body, err := json.Marshal(spec)
2376
++	if err != nil {
2377
++		return nil, err
2378
++	}
2379
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers", api.cfg.endpoint, api.cfg.tenantName,
2380
++		api.cfg.clusterID)
2381
++	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2382
++	if err != nil {
2383
++		return nil, err
2384
++	}
2385
++	defer res.Body.Close()
2386
++	return getTask(getError(res))
2387
++}
2388
++
2389
++// GetLoadBalancer returns a load balancer by name
2390
++func (api *Client) GetLoadBalancer(loadBalancerName *string) (*LoadBalancer, error) {
2391
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers/%s", api.cfg.endpoint, api.cfg.tenantName,
2392
++		api.cfg.clusterID, StringVal(loadBalancerName))
2393
++	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2394
++	if err != nil {
2395
++		return nil, err
2396
++	}
2397
++	defer res.Body.Close()
2398
++	res, err = getError(res)
2399
++	if err != nil {
2400
++		return nil, err
2401
++	}
2402
++	loadBalancer := &LoadBalancer{}
2403
++	err = json.NewDecoder(res.Body).Decode(loadBalancer)
2404
++	return loadBalancer, err
2405
++}
2406
++
2407
++// DeleteLoadBalancer deletes a load balancer by name
2408
++func (api *Client) DeleteLoadBalancer(loadBalancerName *string, subDomain string) (*Task, error) {
2409
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers/%s", api.cfg.endpoint, api.cfg.tenantName,
2410
++		api.cfg.clusterID, StringVal(loadBalancerName))
2411
++
2412
++	if len(subDomain) > 0 {
2413
++		uri = fmt.Sprintf(uri+"?sub-domain=%s", subDomain)
2414
++	}
2415
++
2416
++	res, err := api.restClient.Delete(uri, api.options.TokenOptions)
2417
++	if err != nil {
2418
++		return nil, err
2419
++	}
2420
++	return getTask(getError(res))
2421
++}
2422
++
2423
++// ApplyVMsToLoadBalancer updates the instances that are registered with the load balancer
2424
++func (api *Client) ApplyVMsToLoadBalancer(loadBalancerName *string, update *LoadBalancerVMUpdate) (*Task, error) {
2425
++	body, err := json.Marshal(update)
2426
++	if err != nil {
2427
++		return nil, err
2428
++	}
2429
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/loadbalancers/%s/update_vms", api.cfg.endpoint, api.cfg.tenantName,
2430
++		api.cfg.clusterID, StringVal(loadBalancerName))
2431
++	res, err := api.restClient.Post(uri, "application/json", bytes.NewReader(body), api.options.TokenOptions)
2432
++	if err != nil {
2433
++		return nil, err
2434
++	}
2435
++	defer res.Body.Close()
2436
++	return getTask(getError(res))
2437
++}
2438
++
2439
++// Gets all the zones in which the cluster has the VMs in.
2440
++func (api *Client) GetZones() (zones []string, err error) {
2441
++	// Call the version 2 zones API to use generic zones.
2442
++	uri := fmt.Sprintf("%s/v1/tenants/%s/clusters/%s/zones?version=2", api.cfg.endpoint, api.cfg.tenantName,
2443
++		api.cfg.clusterID)
2444
++	res, err := api.restClient.Get(uri, api.options.TokenOptions)
2445
++	if err != nil {
2446
++		return
2447
++	}
2448
++	defer res.Body.Close()
2449
++	res, err = getError(res)
2450
++	if err != nil {
2451
++		return
2452
++	}
2453
++	err = json.NewDecoder(res.Body).Decode(&zones)
2454
++	return
2455
++}
2456
++
2457
++// Reads a task object out of the HTTP response. Takes an error argument
2458
++// so that GetTask can easily wrap GetError. This function will do nothing
2459
++// if e is not nil.
2460
++// e.g. res, err := getTask(getError(someApi.Get()))
2461
++func getTask(res *http.Response, e error) (*Task, error) {
2462
++	if e != nil {
2463
++		return nil, e
2464
++	}
2465
++	var task Task
2466
++	err := json.NewDecoder(res.Body).Decode(&task)
2467
++	if err != nil {
2468
++		return nil, err
2469
++	}
2470
++	if StringVal(task.State) == "ERROR" {
2471
++		// Critical: return task as well, so that it can be examined
2472
++		// for error details.
2473
++		return &task, TaskError{StringVal(task.ID), getFailedStep(&task)}
2474
++	}
2475
++	return &task, nil
2476
++}
2477
++
2478
++// Gets the failed step in the task to get error details for failed task.
2479
++func getFailedStep(task *Task) (step Step) {
2480
++	var errorStep Step
2481
++	for _, s := range task.Steps {
2482
++		if StringVal(s.State) == "ERROR" {
2483
++			errorStep = *s
2484
++			break
2485
++		}
2486
++	}
2487
++
2488
++	return errorStep
2489
++}
2490
+diff --git a/pkg/cloudprovider/providers/cascade/oidcclient.go b/pkg/cloudprovider/providers/cascade/oidcclient.go
2491
+new file mode 100644
2492
+index 0000000..6a71cc1
2493
+--- /dev/null
2494
+@@ -0,0 +1,297 @@
2495
++package cascade
2496
++
2497
++import (
2498
++	"crypto/tls"
2499
++	"crypto/x509"
2500
++	"encoding/json"
2501
++	"encoding/pem"
2502
++	"fmt"
2503
++	"io/ioutil"
2504
++	"log"
2505
++	"net/http"
2506
++	"net/url"
2507
++	"strings"
2508
++)
2509
++
2510
++const tokenScope string = "openid offline_access"
2511
++
2512
++// OIDCClient is client for OIDC
2513
++type OIDCClient struct {
2514
++	httpClient *http.Client
2515
++	logger     *log.Logger
2516
++
2517
++	Endpoint string
2518
++	Options  *OIDCClientOptions
2519
++}
2520
++
2521
++// OIDCClientOptions is OIDC client options
2522
++type OIDCClientOptions struct {
2523
++	// Whether or not to ignore any TLS errors when talking to Cascade,
2524
++	// false by default.
2525
++	IgnoreCertificate bool
2526
++
2527
++	// List of root CA's to use for server validation
2528
++	// nil by default.
2529
++	RootCAs *x509.CertPool
2530
++
2531
++	// The scope values to use when requesting tokens
2532
++	TokenScope string
2533
++}
2534
++
2535
++// NewOIDCClient creates an instance of OIDCClient
2536
++func NewOIDCClient(endpoint string, options *OIDCClientOptions, logger *log.Logger) (c *OIDCClient) {
2537
++	if logger == nil {
2538
++		logger = log.New(ioutil.Discard, "", log.LstdFlags)
2539
++	}
2540
++
2541
++	options = buildOptions(options)
2542
++	tr := &http.Transport{
2543
++		TLSClientConfig: &tls.Config{
2544
++			InsecureSkipVerify: options.IgnoreCertificate,
2545
++			RootCAs:            options.RootCAs},
2546
++	}
2547
++
2548
++	c = &OIDCClient{
2549
++		httpClient: &http.Client{Transport: tr},
2550
++		logger:     logger,
2551
++		Endpoint:   strings.TrimRight(endpoint, "/"),
2552
++		Options:    options,
2553
++	}
2554
++	return
2555
++}
2556
++
2557
++func buildOptions(options *OIDCClientOptions) (result *OIDCClientOptions) {
2558
++	result = &OIDCClientOptions{
2559
++		TokenScope: tokenScope,
2560
++	}
2561
++
2562
++	if options == nil {
2563
++		return
2564
++	}
2565
++
2566
++	result.IgnoreCertificate = options.IgnoreCertificate
2567
++
2568
++	if options.RootCAs != nil {
2569
++		result.RootCAs = options.RootCAs
2570
++	}
2571
++
2572
++	if options.TokenScope != "" {
2573
++		result.TokenScope = options.TokenScope
2574
++	}
2575
++
2576
++	return
2577
++}
2578
++
2579
++func (client *OIDCClient) buildURL(path string) (url string) {
2580
++	return fmt.Sprintf("%s%s", client.Endpoint, path)
2581
++}
2582
++
2583
++// Cert download helper
2584
++
2585
++const certDownloadPath string = "/afd/vecs/ssl"
2586
++
2587
++type lightWaveCert struct {
2588
++	Value string `json:"encoded"`
2589
++}
2590
++
2591
++// GetRootCerts gets root certs
2592
++func (client *OIDCClient) GetRootCerts() (certList []*x509.Certificate, err error) {
2593
++	// turn TLS verification off for
2594
++	originalTr := client.httpClient.Transport
2595
++	defer client.setTransport(originalTr)
2596
++
2597
++	tr := &http.Transport{
2598
++		TLSClientConfig: &tls.Config{
2599
++			InsecureSkipVerify: false,
2600
++		},
2601
++	}
2602
++	client.setTransport(tr)
2603
++
2604
++	// get the certs
2605
++	resp, err := client.httpClient.Get(client.buildURL(certDownloadPath))
2606
++	if err != nil {
2607
++		return
2608
++	}
2609
++	defer resp.Body.Close()
2610
++	if resp.StatusCode != 200 {
2611
++		err = fmt.Errorf("Unexpected error retrieving auth server certs: %v %s", resp.StatusCode, resp.Status)
2612
++		return
2613
++	}
2614
++
2615
++	// parse the certs
2616
++	certsData := &[]lightWaveCert{}
2617
++	err = json.NewDecoder(resp.Body).Decode(certsData)
2618
++	if err != nil {
2619
++		return
2620
++	}
2621
++
2622
++	certList = make([]*x509.Certificate, len(*certsData))
2623
++	for idx, cert := range *certsData {
2624
++		block, _ := pem.Decode([]byte(cert.Value))
2625
++		if block == nil {
2626
++			err = fmt.Errorf("Unexpected response format: %v", certsData)
2627
++			return nil, err
2628
++		}
2629
++
2630
++		decodedCert, err := x509.ParseCertificate(block.Bytes)
2631
++		if err != nil {
2632
++			return nil, err
2633
++		}
2634
++
2635
++		certList[idx] = decodedCert
2636
++	}
2637
++
2638
++	return
2639
++}
2640
++
2641
++func (client *OIDCClient) setTransport(tr http.RoundTripper) {
2642
++	client.httpClient.Transport = tr
2643
++}
2644
++
2645
++// Metadata request helpers
2646
++const metadataPathFormat string = "/openidconnect/%s/.well-known/openid-configuration"
2647
++
2648
++// OIDCMetadataResponse is the response for Metadata request
2649
++type OIDCMetadataResponse struct {
2650
++	TokenEndpoint         string `json:"token_endpoint"`
2651
++	AuthorizationEndpoint string `json:"authorization_endpoint"`
2652
++	EndSessionEndpoint    string `json:"end_session_endpoint"`
2653
++}
2654
++
2655
++func (client *OIDCClient) getMetadata(domain string) (metadata *OIDCMetadataResponse, err error) {
2656
++	metadataPath := fmt.Sprintf(metadataPathFormat, domain)
2657
++	request, err := http.NewRequest("GET", client.buildURL(metadataPath), nil)
2658
++	if err != nil {
2659
++		return nil, err
2660
++	}
2661
++
2662
++	resp, err := client.httpClient.Do(request)
2663
++	if err != nil {
2664
++		return nil, err
2665
++	}
2666
++	defer resp.Body.Close()
2667
++
2668
++	err = client.checkResponse(resp)
2669
++	if err != nil {
2670
++		return nil, err
2671
++	}
2672
++
2673
++	metadata = &OIDCMetadataResponse{}
2674
++	err = json.NewDecoder(resp.Body).Decode(metadata)
2675
++	if err != nil {
2676
++		return nil, err
2677
++	}
2678
++
2679
++	return
2680
++}
2681
++
2682
++// Token request helpers
2683
++
2684
++const passwordGrantFormatString = "grant_type=password&username=%s&password=%s&scope=%s"
2685
++const refreshTokenGrantFormatString = "grant_type=refresh_token&refresh_token=%s"
2686
++const clientGrantFormatString = "grant_type=password&username=%s&password=%s&scope=%s&client_id=%s"
2687
++
2688
++// OIDCTokenResponse is the response for OIDC request
2689
++type OIDCTokenResponse struct {
2690
++	AccessToken  string `json:"access_token"`
2691
++	ExpiresIn    int    `json:"expires_in"`
2692
++	RefreshToken string `json:"refresh_token,omitempty"`
2693
++	IDToken      string `json:"id_token"`
2694
++	TokenType    string `json:"token_type"`
2695
++}
2696
++
2697
++// GetTokenByPasswordGrant gets OIDC tokens by password
2698
++func (client *OIDCClient) GetTokenByPasswordGrant(domain, username, password string) (tokens *OIDCTokenResponse, err error) {
2699
++	metadata, err := client.getMetadata(domain)
2700
++	if err != nil {
2701
++		return nil, err
2702
++	}
2703
++
2704
++	username = url.QueryEscape(username)
2705
++	password = url.QueryEscape(password)
2706
++	body := fmt.Sprintf(passwordGrantFormatString, username, password, client.Options.TokenScope)
2707
++	return client.getToken(metadata.TokenEndpoint, body)
2708
++}
2709
++
2710
++// GetClientTokenByPasswordGrant gets OIDC tokens by password
2711
++func (client *OIDCClient) GetClientTokenByPasswordGrant(domain, username, password, clientID string) (tokens *OIDCTokenResponse, err error) {
2712
++	metadata, err := client.getMetadata(domain)
2713
++	if err != nil {
2714
++		return nil, err
2715
++	}
2716
++
2717
++	username = url.QueryEscape(username)
2718
++	password = url.QueryEscape(password)
2719
++	clientID = url.QueryEscape(clientID)
2720
++	body := fmt.Sprintf(clientGrantFormatString, username, password, client.Options.TokenScope, clientID)
2721
++	return client.getToken(metadata.TokenEndpoint, body)
2722
++}
2723
++
2724
++// GetTokenByRefreshTokenGrant gets OIDC tokens by refresh token
2725
++func (client *OIDCClient) GetTokenByRefreshTokenGrant(domain, refreshToken string) (tokens *OIDCTokenResponse, err error) {
2726
++	metadata, err := client.getMetadata(domain)
2727
++	if err != nil {
2728
++		return nil, err
2729
++	}
2730
++
2731
++	body := fmt.Sprintf(refreshTokenGrantFormatString, refreshToken)
2732
++	return client.getToken(metadata.TokenEndpoint, body)
2733
++}
2734
++
2735
++func (client *OIDCClient) getToken(tokenEndpoint, body string) (tokens *OIDCTokenResponse, err error) {
2736
++	request, err := http.NewRequest("POST", tokenEndpoint, strings.NewReader(body))
2737
++	if err != nil {
2738
++		return nil, err
2739
++	}
2740
++	request.Header.Add("Content-Type", "application/x-www-form-urlencoded")
2741
++
2742
++	resp, err := client.httpClient.Do(request)
2743
++	if err != nil {
2744
++		return nil, err
2745
++	}
2746
++	defer resp.Body.Close()
2747
++
2748
++	err = client.checkResponse(resp)
2749
++	if err != nil {
2750
++		return nil, err
2751
++	}
2752
++
2753
++	tokens = &OIDCTokenResponse{}
2754
++	err = json.NewDecoder(resp.Body).Decode(tokens)
2755
++	if err != nil {
2756
++		return nil, err
2757
++	}
2758
++
2759
++	return
2760
++}
2761
++
2762
++// OIDCError is OIDC error
2763
++type OIDCError struct {
2764
++	Code    string `json:"error"`
2765
++	Message string `json:"error_description"`
2766
++}
2767
++
2768
++func (e OIDCError) Error() string {
2769
++	return fmt.Sprintf("%v: %v", e.Code, e.Message)
2770
++}
2771
++
2772
++func (client *OIDCClient) checkResponse(response *http.Response) (err error) {
2773
++	if response.StatusCode/100 == 2 {
2774
++		return
2775
++	}
2776
++
2777
++	respBody, readErr := ioutil.ReadAll(response.Body)
2778
++	if readErr != nil {
2779
++		return fmt.Errorf(
2780
++			"Status: %v, Body: %v [%v]", response.Status, string(respBody[:]), readErr)
2781
++	}
2782
++
2783
++	var oidcErr OIDCError
2784
++	err = json.Unmarshal(respBody, &oidcErr)
2785
++	if err != nil || oidcErr.Code == "" {
2786
++		return fmt.Errorf(
2787
++			"Status: %v, Body: %v [%v]", response.Status, string(respBody[:]), readErr)
2788
++	}
2789
++
2790
++	return oidcErr
2791
++}
2792
+diff --git a/pkg/cloudprovider/providers/cascade/restclient.go b/pkg/cloudprovider/providers/cascade/restclient.go
2793
+new file mode 100644
2794
+index 0000000..71d8d1c
2795
+--- /dev/null
2796
+@@ -0,0 +1,262 @@
2797
++package cascade
2798
++
2799
++import (
2800
++	"bytes"
2801
++	"encoding/json"
2802
++	"io"
2803
++	"io/ioutil"
2804
++	"net/http"
2805
++)
2806
++
2807
++type restClient struct {
2808
++	httpClient                *http.Client
2809
++	authClient                *AuthClient
2810
++	UpdateAccessTokenCallback TokenCallback
2811
++}
2812
++
2813
++type request struct {
2814
++	Method      string
2815
++	URL         string
2816
++	ContentType string
2817
++	Body        io.Reader
2818
++	Tokens      *TokenOptions
2819
++}
2820
++
2821
++type page struct {
2822
++	Items            []interface{} `json:"items"`
2823
++	NextPageLink     string        `json:"nextPageLink"`
2824
++	PreviousPageLink string        `json:"previousPageLink"`
2825
++}
2826
++
2827
++type documentList struct {
2828
++	Items []interface{}
2829
++}
2830
++
2831
++type bodyRewinder func() io.Reader
2832
++
2833
++const appJson string = "application/json"
2834
++const expiredAuthToken int32 = 1904
2835
++
2836
++func (client *restClient) AppendSlice(origSlice []interface{}, dataToAppend []interface{}) []interface{} {
2837
++	origLen := len(origSlice)
2838
++	newLen := origLen + len(dataToAppend)
2839
++
2840
++	if newLen > cap(origSlice) {
2841
++		newSlice := make([]interface{}, (newLen+1)*2)
2842
++		copy(newSlice, origSlice)
2843
++		origSlice = newSlice
2844
++	}
2845
++
2846
++	origSlice = origSlice[0:newLen]
2847
++	copy(origSlice[origLen:newLen], dataToAppend)
2848
++
2849
++	return origSlice
2850
++}
2851
++
2852
++func (client *restClient) Get(url string, tokens *TokenOptions) (res *http.Response, err error) {
2853
++	req := request{"GET", url, "", nil, tokens}
2854
++	res, err = client.SendRequest(&req, nil)
2855
++	return
2856
++}
2857
++
2858
++func (client *restClient) GetList(endpoint string, url string, tokens *TokenOptions) (result []byte, err error) {
2859
++	req := request{"GET", url, "", nil, tokens}
2860
++	res, err := client.SendRequest(&req, nil)
2861
++	if err != nil {
2862
++		return
2863
++	}
2864
++	res, err = getError(res)
2865
++	if err != nil {
2866
++		return
2867
++	}
2868
++
2869
++	decoder := json.NewDecoder(res.Body)
2870
++	decoder.UseNumber()
2871
++
2872
++	page := &page{}
2873
++	err = decoder.Decode(page)
2874
++	if err != nil {
2875
++		return
2876
++	}
2877
++
2878
++	documentList := &documentList{}
2879
++	documentList.Items = client.AppendSlice(documentList.Items, page.Items)
2880
++
2881
++	for page.NextPageLink != "" {
2882
++		req = request{"GET", endpoint + page.NextPageLink, "", nil, tokens}
2883
++		res, err = client.SendRequest(&req, nil)
2884
++		if err != nil {
2885
++			return
2886
++		}
2887
++		res, err = getError(res)
2888
++		if err != nil {
2889
++			return
2890
++		}
2891
++
2892
++		decoder = json.NewDecoder(res.Body)
2893
++		decoder.UseNumber()
2894
++
2895
++		page.NextPageLink = ""
2896
++		page.PreviousPageLink = ""
2897
++
2898
++		err = decoder.Decode(page)
2899
++		if err != nil {
2900
++			return
2901
++		}
2902
++
2903
++		documentList.Items = client.AppendSlice(documentList.Items, page.Items)
2904
++	}
2905
++
2906
++	result, err = json.Marshal(documentList)
2907
++
2908
++	return
2909
++}
2910
++
2911
++func (client *restClient) Post(url string, contentType string, body io.ReadSeeker, tokens *TokenOptions) (res *http.Response, err error) {
2912
++	if contentType == "" {
2913
++		contentType = appJson
2914
++	}
2915
++
2916
++	req := request{"POST", url, contentType, body, tokens}
2917
++	rewinder := func() io.Reader {
2918
++		body.Seek(0, 0)
2919
++		return body
2920
++	}
2921
++	res, err = client.SendRequest(&req, rewinder)
2922
++	return
2923
++}
2924
++
2925
++func (client *restClient) Patch(url string, contentType string, body io.ReadSeeker, tokens *TokenOptions) (res *http.Response, err error) {
2926
++	if contentType == "" {
2927
++		contentType = appJson
2928
++	}
2929
++
2930
++	req := request{"PATCH", url, contentType, body, tokens}
2931
++	rewinder := func() io.Reader {
2932
++		body.Seek(0, 0)
2933
++		return body
2934
++	}
2935
++	res, err = client.SendRequest(&req, rewinder)
2936
++	return
2937
++}
2938
++
2939
++func (client *restClient) Put(url string, contentType string, body io.ReadSeeker, tokens *TokenOptions) (res *http.Response, err error) {
2940
++	if contentType == "" {
2941
++		contentType = appJson
2942
++	}
2943
++
2944
++	req := request{"PUT", url, contentType, body, tokens}
2945
++	rewinder := func() io.Reader {
2946
++		body.Seek(0, 0)
2947
++		return body
2948
++	}
2949
++	res, err = client.SendRequest(&req, rewinder)
2950
++	return
2951
++}
2952
++
2953
++func (client *restClient) Delete(url string, tokens *TokenOptions) (res *http.Response, err error) {
2954
++	req := request{"DELETE", url, "", nil, tokens}
2955
++	res, err = client.SendRequest(&req, nil)
2956
++	return
2957
++}
2958
++
2959
++func (client *restClient) SendRequest(req *request, bodyRewinder bodyRewinder) (res *http.Response, err error) {
2960
++	res, err = client.sendRequestHelper(req)
2961
++	// In most cases, we'll return immediately
2962
++	// If the operation succeeded, but we got a 401 response and if we're using
2963
++	// authentication, then we'll look into the body to see if the token expired
2964
++	if err != nil {
2965
++		return res, err
2966
++	}
2967
++	if res.StatusCode != 401 {
2968
++		// It's not a 401, so the token didn't expire
2969
++		return res, err
2970
++	}
2971
++	if req.Tokens == nil || req.Tokens.AccessToken == "" {
2972
++		// We don't have a token, so we can't renew the token, no need to proceed
2973
++		return res, err
2974
++	}
2975
++
2976
++	// We're going to look in the body to see if it failed because the token expired
2977
++	// This means we need to read the body, but the functions that call us also
2978
++	// expect to read the body. So we read the body, then create a new reader
2979
++	// so they can read the body as normal.
2980
++	body, err := ioutil.ReadAll(res.Body)
2981
++	if err != nil {
2982
++		return res, err
2983
++	}
2984
++	res.Body = ioutil.NopCloser(bytes.NewReader(body))
2985
++
2986
++	// Now see if we had an expired token or not
2987
++	var apiError APIError
2988
++	err = json.Unmarshal(body, &apiError)
2989
++	if err != nil {
2990
++		return res, err
2991
++	}
2992
++	if apiError.ErrorCode != expiredAuthToken {
2993
++		return res, nil
2994
++	}
2995
++
2996
++	// We were told that the access token expired, so we acquire a new token using the refresh token.
2997
++	newTokens, err := client.authClient.GetTokensByRefreshToken(req.Tokens.RefreshToken)
2998
++	// If there is an error during token refresh, we assume that the refresh token also expired. So we login again using
2999
++	// the machine account.
3000
++	if err != nil {
3001
++		newTokens, err = client.authClient.GetTokensByMachineAccount()
3002
++		if err != nil {
3003
++			return res, err
3004
++		}
3005
++	}
3006
++	req.Tokens.AccessToken = newTokens.AccessToken
3007
++	if client.UpdateAccessTokenCallback != nil {
3008
++		client.UpdateAccessTokenCallback(newTokens.AccessToken)
3009
++	}
3010
++	if req.Body != nil && bodyRewinder != nil {
3011
++		req.Body = bodyRewinder()
3012
++	}
3013
++	res, err = client.sendRequestHelper(req)
3014
++	return res, nil
3015
++}
3016
++
3017
++func (client *restClient) sendRequestHelper(req *request) (res *http.Response, err error) {
3018
++	r, err := http.NewRequest(req.Method, req.URL, req.Body)
3019
++	if err != nil {
3020
++		return
3021
++	}
3022
++	if req.ContentType != "" {
3023
++		r.Header.Add("Content-Type", req.ContentType)
3024
++	}
3025
++	if req.Tokens != nil && req.Tokens.AccessToken != "" {
3026
++		r.Header.Add("Authorization", "Bearer "+req.Tokens.AccessToken)
3027
++	}
3028
++	res, err = client.httpClient.Do(r)
3029
++	if err != nil {
3030
++		return
3031
++	}
3032
++
3033
++	return
3034
++}
3035
++
3036
++// Reads an error out of the HTTP response, or does nothing if
3037
++// no error occured.
3038
++func getError(res *http.Response) (*http.Response, error) {
3039
++	// Do nothing if the response is a successful 2xx
3040
++	if res.StatusCode/100 == 2 {
3041
++		return res, nil
3042
++	}
3043
++	var apiError APIError
3044
++	// ReadAll is usually a bad practice, but here we need to read the response all
3045
++	// at once because we may attempt to use the data twice. It's preferable to use
3046
++	// methods that take io.Reader, e.g. json.NewDecoder
3047
++	body, err := ioutil.ReadAll(res.Body)
3048
++	if err != nil {
3049
++		return nil, err
3050
++	}
3051
++	err = json.Unmarshal(body, &apiError)
3052
++	if err != nil {
3053
++		// If deserializing into ApiError fails, return a generic HttpError instead
3054
++		return nil, HttpError{res.StatusCode, string(body[:])}
3055
++	}
3056
++	apiError.HttpStatusCode = res.StatusCode
3057
++	return nil, apiError
3058
++}
3059
+diff --git a/pkg/cloudprovider/providers/cascade/tests_owed b/pkg/cloudprovider/providers/cascade/tests_owed
3060
+new file mode 100644
3061
+index 0000000..dff5ab1
3062
+--- /dev/null
3063
+@@ -0,0 +1,5 @@
3064
++
3065
++Yu Sheng
3066
++Change-Id: Ifc11818f65a3e018aeea6988d9e2c0719b592920
3067
++
3068
++
3069
+diff --git a/pkg/cloudprovider/providers/cascade/utils.go b/pkg/cloudprovider/providers/cascade/utils.go
3070
+new file mode 100644
3071
+index 0000000..866f853
3072
+--- /dev/null
3073
+@@ -0,0 +1,29 @@
3074
++package cascade
3075
++
3076
++func StringPtr(s string) *string {
3077
++	return &s
3078
++}
3079
++
3080
++// StringVal returns string from string pointer, nil returns ""
3081
++func StringVal(p *string) (s string) {
3082
++	if p != nil {
3083
++		s = *p
3084
++	}
3085
++	return
3086
++}
3087
++
3088
++func Int64Ptr(s int64) *int64 {
3089
++	return &s
3090
++}
3091
++
3092
++func Int64Val(s *int64) int64 {
3093
++	return *s
3094
++}
3095
++
3096
++func Int32Ptr(s int32) *int32 {
3097
++	return &s
3098
++}
3099
++
3100
++func BoolPtr(s bool) *bool {
3101
++	return &s
3102
++}
3103
+diff --git a/pkg/cloudprovider/providers/providers.go b/pkg/cloudprovider/providers/providers.go
3104
+index 7de9ca9..a655477 100644
3105
+--- a/pkg/cloudprovider/providers/providers.go
3106
+@@ -21,6 +21,7 @@ import (
3107
+ 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/aws"
3108
+ 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/azure"
3109
+ 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/cloudstack"
3110
++	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
3111
+ 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
3112
+ 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack"
3113
+ 	_ "k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt"
3114
+diff --git a/pkg/kubeapiserver/authorizer/config.go b/pkg/kubeapiserver/authorizer/config.go
3115
+index 00224fd..ceddc23 100644
3116
+--- a/pkg/kubeapiserver/authorizer/config.go
3117
+@@ -31,6 +31,7 @@ import (
3118
+ 	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/node"
3119
+ 	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac"
3120
+ 	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/rbac/bootstrappolicy"
3121
++	"k8s.io/kubernetes/plugin/pkg/auth/authorizer/vke"
3122
+ )
3123
+ 
3124
+ type AuthorizationConfig struct {
3125
+@@ -80,6 +81,12 @@ func (config AuthorizationConfig) New() (authorizer.Authorizer, authorizer.RuleR
3126
+ 			nodeAuthorizer := node.NewAuthorizer(graph, nodeidentifier.NewDefaultNodeIdentifier(), bootstrappolicy.NodeRules())
3127
+ 			authorizers = append(authorizers, nodeAuthorizer)
3128
+ 
3129
++		case modes.ModeVKE:
3130
++			vkeAuthorizer, err := vke.NewAuthorizer()
3131
++			if err != nil {
3132
++				return nil, nil, err
3133
++			}
3134
++			authorizers = append(authorizers, vkeAuthorizer)
3135
+ 		case modes.ModeAlwaysAllow:
3136
+ 			alwaysAllowAuthorizer := authorizerfactory.NewAlwaysAllowAuthorizer()
3137
+ 			authorizers = append(authorizers, alwaysAllowAuthorizer)
3138
+diff --git a/pkg/kubeapiserver/authorizer/modes/modes.go b/pkg/kubeapiserver/authorizer/modes/modes.go
3139
+index 54d0a62..73a763f 100644
3140
+--- a/pkg/kubeapiserver/authorizer/modes/modes.go
3141
+@@ -25,9 +25,10 @@ const (
3142
+ 	ModeWebhook     string = "Webhook"
3143
+ 	ModeRBAC        string = "RBAC"
3144
+ 	ModeNode        string = "Node"
3145
++	ModeVKE         string = "VKE"
3146
+ )
3147
+ 
3148
+-var AuthorizationModeChoices = []string{ModeAlwaysAllow, ModeAlwaysDeny, ModeABAC, ModeWebhook, ModeRBAC, ModeNode}
3149
++var AuthorizationModeChoices = []string{ModeAlwaysAllow, ModeAlwaysDeny, ModeABAC, ModeWebhook, ModeRBAC, ModeNode, ModeVKE}
3150
+ 
3151
+ // IsValidAuthorizationMode returns true if the given authorization mode is a valid one for the apiserver
3152
+ func IsValidAuthorizationMode(authzMode string) bool {
3153
+diff --git a/pkg/kubeapiserver/options/plugins.go b/pkg/kubeapiserver/options/plugins.go
3154
+index abcb5b4..292fcdd 100644
3155
+--- a/pkg/kubeapiserver/options/plugins.go
3156
+@@ -57,6 +57,7 @@ import (
3157
+ 	"k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle"
3158
+ 	mutatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating"
3159
+ 	validatingwebhook "k8s.io/apiserver/pkg/admission/plugin/webhook/validating"
3160
++	"k8s.io/kubernetes/plugin/pkg/admission/vke"
3161
+ 	utilfeature "k8s.io/apiserver/pkg/util/feature"
3162
+ 	"k8s.io/kubernetes/pkg/features"
3163
+ )
3164
+@@ -93,6 +94,7 @@ var AllOrderedPlugins = []string{
3165
+ 	initialization.PluginName,               // Initializers
3166
+ 	validatingwebhook.PluginName,            // ValidatingAdmissionWebhook
3167
+ 	resourcequota.PluginName,                // ResourceQuota
3168
++	vke.PluginName,                          // VMwareAdmissionController
3169
+ 	deny.PluginName,                         // AlwaysDeny
3170
+ }
3171
+ 
3172
+@@ -125,6 +127,7 @@ func RegisterAllAdmissionPlugins(plugins *admission.Plugins) {
3173
+ 	setdefault.Register(plugins)
3174
+ 	resize.Register(plugins)
3175
+ 	storageobjectinuseprotection.Register(plugins)
3176
++	vke.Register(plugins)
3177
+ }
3178
+ 
3179
+ // DefaultOffAdmissionPlugins get admission plugins off by default for kube-apiserver.
3180
+diff --git a/pkg/printers/internalversion/describe.go b/pkg/printers/internalversion/describe.go
3181
+index 1fe2b0f..fd8a3ae 100644
3182
+--- a/pkg/printers/internalversion/describe.go
3183
+@@ -761,6 +761,8 @@ func describeVolumes(volumes []api.Volume, w PrefixWriter, space string) {
3184
+ 			printFlexVolumeSource(volume.VolumeSource.FlexVolume, w)
3185
+ 		case volume.VolumeSource.Flocker != nil:
3186
+ 			printFlockerVolumeSource(volume.VolumeSource.Flocker, w)
3187
++		case volume.VolumeSource.CascadeDisk != nil:
3188
++			printCascadeDiskVolumeSource(volume.VolumeSource.CascadeDisk, w)
3189
+ 		default:
3190
+ 			w.Write(LEVEL_1, "<unknown>\n")
3191
+ 		}
3192
+@@ -1173,6 +1175,13 @@ func printCSIPersistentVolumeAttributesMultilineIndent(w PrefixWriter, initialIn
3193
+ 	}
3194
+ }
3195
+ 
3196
++func printCascadeDiskVolumeSource(cascade *api.CascadeDiskVolumeSource, w PrefixWriter) {
3197
++	w.Write(LEVEL_2, "Type:\tVKEDisk (a Persistent Disk resource in VKE)\n"+
3198
++		"    DiskID:\t%v\n"+
3199
++		"    FSType:\t%v\n",
3200
++		cascade.DiskID, cascade.FSType)
3201
++}
3202
++
3203
+ type PersistentVolumeDescriber struct {
3204
+ 	clientset.Interface
3205
+ }
3206
+@@ -1309,6 +1318,8 @@ func describePersistentVolume(pv *api.PersistentVolume, events *api.EventList) (
3207
+ 			printFlockerVolumeSource(pv.Spec.Flocker, w)
3208
+ 		case pv.Spec.CSI != nil:
3209
+ 			printCSIPersistentVolumeSource(pv.Spec.CSI, w)
3210
++		case pv.Spec.CascadeDisk != nil:
3211
++			printCascadeDiskVolumeSource(pv.Spec.CascadeDisk, w)
3212
+ 		default:
3213
+ 			w.Write(LEVEL_1, "<unknown>\n")
3214
+ 		}
3215
+diff --git a/pkg/security/podsecuritypolicy/util/util.go b/pkg/security/podsecuritypolicy/util/util.go
3216
+index 3f29f6e..8e96503 100644
3217
+--- a/pkg/security/podsecuritypolicy/util/util.go
3218
+@@ -68,6 +68,7 @@ func GetAllFSTypesAsSet() sets.String {
3219
+ 		string(policy.PortworxVolume),
3220
+ 		string(policy.ScaleIO),
3221
+ 		string(policy.CSI),
3222
++		string(policy.CascadeDisk),
3223
+ 	)
3224
+ 	return fstypes
3225
+ }
3226
+@@ -129,6 +130,8 @@ func GetVolumeFSType(v api.Volume) (policy.FSType, error) {
3227
+ 		return policy.PortworxVolume, nil
3228
+ 	case v.ScaleIO != nil:
3229
+ 		return policy.ScaleIO, nil
3230
++	case v.CascadeDisk != nil:
3231
++		return policy.CascadeDisk, nil
3232
+ 	}
3233
+ 
3234
+ 	return "", fmt.Errorf("unknown volume type for volume: %#v", v)
3235
+diff --git a/pkg/volume/cascade_disk/BUILD b/pkg/volume/cascade_disk/BUILD
3236
+new file mode 100644
3237
+index 0000000..3386612
3238
+--- /dev/null
3239
+@@ -0,0 +1,43 @@
3240
++package(default_visibility = ["//visibility:public"])
3241
++
3242
++load(
3243
++    "@io_bazel_rules_go//go:def.bzl",
3244
++    "go_library",
3245
++    "go_test",
3246
++)
3247
++
3248
++go_library(
3249
++    name = "go_default_library",
3250
++    srcs = [
3251
++        "attacher.go",
3252
++        "cascade_disk.go",
3253
++        "cascade_util.go",
3254
++    ],
3255
++    deps = [
3256
++        "//pkg/cloudprovider:go_default_library",
3257
++        "//pkg/cloudprovider/providers/cascade:go_default_library",
3258
++        "//pkg/util/mount:go_default_library",
3259
++        "//pkg/util/strings:go_default_library",
3260
++        "//pkg/volume:go_default_library",
3261
++        "//pkg/volume/util:go_default_library",
3262
++        "//pkg/volume/util/volumehelper:go_default_library",
3263
++        "//vendor/github.com/golang/glog:go_default_library",
3264
++        "//vendor/k8s.io/api/core/v1:go_default_library",
3265
++        "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
3266
++        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
3267
++        "//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
3268
++    ],
3269
++)
3270
++
3271
++filegroup(
3272
++    name = "package-srcs",
3273
++    srcs = glob(["**"]),
3274
++    tags = ["automanaged"],
3275
++    visibility = ["//visibility:private"],
3276
++)
3277
++
3278
++filegroup(
3279
++    name = "all-srcs",
3280
++    srcs = [":package-srcs"],
3281
++    tags = ["automanaged"],
3282
++)
3283
+diff --git a/pkg/volume/cascade_disk/OWNERS b/pkg/volume/cascade_disk/OWNERS
3284
+new file mode 100644
3285
+index 0000000..c3a4ed7
3286
+--- /dev/null
3287
+@@ -0,0 +1,2 @@
3288
++maintainers:
3289
++- ashokc
3290
+diff --git a/pkg/volume/cascade_disk/attacher.go b/pkg/volume/cascade_disk/attacher.go
3291
+new file mode 100644
3292
+index 0000000..abcbdb6
3293
+--- /dev/null
3294
+@@ -0,0 +1,273 @@
3295
++package cascade_disk
3296
++
3297
++import (
3298
++	"fmt"
3299
++	"os"
3300
++	"path"
3301
++	"time"
3302
++
3303
++	"github.com/golang/glog"
3304
++	"k8s.io/api/core/v1"
3305
++	"k8s.io/apimachinery/pkg/types"
3306
++	"k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
3307
++	"k8s.io/kubernetes/pkg/util/mount"
3308
++	"k8s.io/kubernetes/pkg/volume"
3309
++	volumeutil "k8s.io/kubernetes/pkg/volume/util"
3310
++)
3311
++
3312
++type cascadeDiskAttacher struct {
3313
++	host         volume.VolumeHost
3314
++	cascadeDisks cascade.Disks
3315
++}
3316
++
3317
++var _ volume.Attacher = &cascadeDiskAttacher{}
3318
++var _ volume.AttachableVolumePlugin = &cascadeDiskPlugin{}
3319
++
3320
++func (plugin *cascadeDiskPlugin) NewAttacher() (volume.Attacher, error) {
3321
++	cascadeCloud, err := getCloudProvider(plugin.host.GetCloudProvider())
3322
++	if err != nil {
3323
++		glog.Errorf("Cascade attacher: NewAttacher failed to get cloud provider")
3324
++		return nil, err
3325
++	}
3326
++
3327
++	return &cascadeDiskAttacher{
3328
++		host:         plugin.host,
3329
++		cascadeDisks: cascadeCloud,
3330
++	}, nil
3331
++}
3332
++
3333
++// Attach attaches the volume specified by the given spec to the given host. On success, returns the device path where
3334
++// the device was attached on the node.
3335
++func (attacher *cascadeDiskAttacher) Attach(spec *volume.Spec, nodeName types.NodeName) (string, error) {
3336
++	hostName := string(nodeName)
3337
++	volumeSource, _, err := getVolumeSource(spec)
3338
++	if err != nil {
3339
++		glog.Errorf("Cascade attacher: Attach failed to get volume source")
3340
++		return "", err
3341
++	}
3342
++
3343
++	// cascadeDisks.AttachDisk checks if disk is already attached to the node. So we don't have to do that separately
3344
++	// here.
3345
++	glog.V(4).Infof("Cascade: Attach disk called for host %s", hostName)
3346
++	devicePath, err := attacher.cascadeDisks.AttachDisk(volumeSource.DiskID, nodeName)
3347
++	if err != nil {
3348
++		glog.Errorf("Error attaching volume %q to node %q: %+v", volumeSource.DiskID, nodeName, err)
3349
++		return "", err
3350
++	}
3351
++	return devicePath, nil
3352
++}
3353
++
3354
++// VolumesAreAttached verifies whether the volumes specified in the spec are attached to the specified node.
3355
++func (attacher *cascadeDiskAttacher) VolumesAreAttached(specs []*volume.Spec,
3356
++	nodeName types.NodeName) (map[*volume.Spec]bool, error) {
3357
++	volumesAttachedCheck := make(map[*volume.Spec]bool)
3358
++	volumeSpecMap := make(map[string]*volume.Spec)
3359
++	diskIDList := []string{}
3360
++	for _, spec := range specs {
3361
++		volumeSource, _, err := getVolumeSource(spec)
3362
++		if err != nil {
3363
++			glog.Errorf("Error getting volume (%q) source : %v", spec.Name(), err)
3364
++			continue
3365
++		}
3366
++
3367
++		diskIDList = append(diskIDList, volumeSource.DiskID)
3368
++		volumesAttachedCheck[spec] = true
3369
++		volumeSpecMap[volumeSource.DiskID] = spec
3370
++	}
3371
++	attachedResult, err := attacher.cascadeDisks.DisksAreAttached(diskIDList, nodeName)
3372
++	if err != nil {
3373
++		glog.Errorf(
3374
++			"Error checking if volumes (%v) are attached to current node (%q). err=%v",
3375
++			diskIDList, nodeName, err)
3376
++		return volumesAttachedCheck, err
3377
++	}
3378
++
3379
++	for diskID, attached := range attachedResult {
3380
++		if !attached {
3381
++			spec := volumeSpecMap[diskID]
3382
++			volumesAttachedCheck[spec] = false
3383
++			glog.V(2).Infof("VolumesAreAttached: check volume %q (specName: %q) is no longer attached",
3384
++				diskID, spec.Name())
3385
++		}
3386
++	}
3387
++	return volumesAttachedCheck, nil
3388
++}
3389
++
3390
++// WaitForAttach waits until the devicePath returned by the Attach call is available.
3391
++func (attacher *cascadeDiskAttacher) WaitForAttach(spec *volume.Spec, devicePath string, _ *v1.Pod,
3392
++	timeout time.Duration) (string, error) {
3393
++	volumeSource, _, err := getVolumeSource(spec)
3394
++	if err != nil {
3395
++		glog.Errorf("Cascade attacher: WaitForAttach failed to get volume source")
3396
++		return "", err
3397
++	}
3398
++
3399
++	if devicePath == "" {
3400
++		return "", fmt.Errorf("WaitForAttach failed for disk %s: devicePath is empty.", volumeSource.DiskID)
3401
++	}
3402
++
3403
++	ticker := time.NewTicker(checkSleepDuration)
3404
++	defer ticker.Stop()
3405
++
3406
++	timer := time.NewTimer(timeout)
3407
++	defer timer.Stop()
3408
++
3409
++	for {
3410
++		select {
3411
++		case <-ticker.C:
3412
++			glog.V(4).Infof("Checking disk %s is attached", volumeSource.DiskID)
3413
++			devicePath := getDiskByIdPath(devicePath)
3414
++			checkPath, err := verifyDevicePath(devicePath)
3415
++			if err != nil {
3416
++				// Log error, if any, and continue checking periodically. See issue #11321
3417
++				glog.Warningf("Cascade attacher: WaitForAttach with devicePath %s Checking PD %s Error verify "+
3418
++					"path", devicePath, volumeSource.DiskID)
3419
++			} else if checkPath != "" {
3420
++				// A device path has successfully been created for the disk
3421
++				glog.V(4).Infof("Successfully found attached disk %s.", volumeSource.DiskID)
3422
++				return checkPath, nil
3423
++			}
3424
++		case <-timer.C:
3425
++			return "", fmt.Errorf("Could not find attached disk %s. Timeout waiting for mount paths to be "+
3426
++				"created.", volumeSource.DiskID)
3427
++		}
3428
++	}
3429
++}
3430
++
3431
++// GetDeviceMountPath returns a path where the device should point which should be bind mounted for individual volumes.
3432
++func (attacher *cascadeDiskAttacher) GetDeviceMountPath(spec *volume.Spec) (string, error) {
3433
++	volumeSource, _, err := getVolumeSource(spec)
3434
++	if err != nil {
3435
++		glog.Errorf("Cascade attacher: GetDeviceMountPath failed to get volume source")
3436
++		return "", err
3437
++	}
3438
++
3439
++	return makeGlobalPDPath(attacher.host, volumeSource.DiskID), nil
3440
++}
3441
++
3442
++// GetMountDeviceRefs finds all other references to the device referenced by deviceMountPath; returns a list of paths.
3443
++func (plugin *cascadeDiskPlugin) GetDeviceMountRefs(deviceMountPath string) ([]string, error) {
3444
++	mounter := plugin.host.GetMounter(plugin.GetPluginName())
3445
++	return mounter.GetMountRefs(deviceMountPath)
3446
++}
3447
++
3448
++// MountDevice mounts device to global mount point.
3449
++func (attacher *cascadeDiskAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error {
3450
++	mounter := attacher.host.GetMounter(cascadeDiskPluginName)
3451
++	notMnt, err := mounter.IsLikelyNotMountPoint(deviceMountPath)
3452
++	if err != nil {
3453
++		if os.IsNotExist(err) {
3454
++			if err := os.MkdirAll(deviceMountPath, 0750); err != nil {
3455
++				glog.Errorf("Failed to create directory at %#v. err: %s", deviceMountPath, err)
3456
++				return err
3457
++			}
3458
++			notMnt = true
3459
++		} else {
3460
++			return err
3461
++		}
3462
++	}
3463
++
3464
++	volumeSource, _, err := getVolumeSource(spec)
3465
++	if err != nil {
3466
++		glog.Errorf("Cascade attacher: MountDevice failed to get volume source. err: %s", err)
3467
++		return err
3468
++	}
3469
++
3470
++	options := []string{}
3471
++
3472
++	if notMnt {
3473
++		diskMounter := volumeutil.NewSafeFormatAndMountFromHost(cascadeDiskPluginName, attacher.host)
3474
++		mountOptions := volumeutil.MountOptionFromSpec(spec)
3475
++		err = diskMounter.FormatAndMount(devicePath, deviceMountPath, volumeSource.FSType, mountOptions)
3476
++		if err != nil {
3477
++			os.Remove(deviceMountPath)
3478
++			return err
3479
++		}
3480
++		glog.V(4).Infof("formatting spec %v devicePath %v deviceMountPath %v fs %v with options %+v",
3481
++			spec.Name(), devicePath, deviceMountPath, volumeSource.FSType, options)
3482
++	}
3483
++	return nil
3484
++}
3485
++
3486
++type cascadeDiskDetacher struct {
3487
++	mounter      mount.Interface
3488
++	cascadeDisks cascade.Disks
3489
++}
3490
++
3491
++var _ volume.Detacher = &cascadeDiskDetacher{}
3492
++
3493
++// NewDetacher returns the detacher associated with the Cascade volume plugin.
3494
++func (plugin *cascadeDiskPlugin) NewDetacher() (volume.Detacher, error) {
3495
++	cascadeCloud, err := getCloudProvider(plugin.host.GetCloudProvider())
3496
++	if err != nil {
3497
++		glog.Errorf("Cascade attacher: NewDetacher failed to get cloud provider. err: %s", err)
3498
++		return nil, err
3499
++	}
3500
++
3501
++	return &cascadeDiskDetacher{
3502
++		mounter:      plugin.host.GetMounter(plugin.GetPluginName()),
3503
++		cascadeDisks: cascadeCloud,
3504
++	}, nil
3505
++}
3506
++
3507
++// Detach detaches the given device from the given host.
3508
++func (detacher *cascadeDiskDetacher) Detach(deviceMountPath string, nodeName types.NodeName) error {
3509
++	hostName := string(nodeName)
3510
++	diskID := path.Base(deviceMountPath)
3511
++	attached, err := detacher.cascadeDisks.DiskIsAttached(diskID, nodeName)
3512
++	if err != nil {
3513
++		// Log error and continue with detach
3514
++		glog.Errorf(
3515
++			"Error checking if persistent disk (%q) is already attached to current node (%q). "+
3516
++				"Will continue and try detach anyway. err=%v", diskID, hostName, err)
3517
++	}
3518
++
3519
++	if err == nil && !attached {
3520
++		// Volume is already detached from node.
3521
++		glog.V(4).Infof("detach operation was successful. persistent disk %q is already detached "+
3522
++			"from node %q.", diskID, hostName)
3523
++		return nil
3524
++	}
3525
++
3526
++	if err := detacher.cascadeDisks.DetachDisk(diskID, nodeName); err != nil {
3527
++		glog.Errorf("Error detaching volume %q: %v", diskID, err)
3528
++		return err
3529
++	}
3530
++	return nil
3531
++}
3532
++
3533
++// WaitForDetach waits for the devicePath to become unavailable.
3534
++func (detacher *cascadeDiskDetacher) WaitForDetach(devicePath string, timeout time.Duration) error {
3535
++	ticker := time.NewTicker(checkSleepDuration)
3536
++	defer ticker.Stop()
3537
++	timer := time.NewTimer(timeout)
3538
++	defer timer.Stop()
3539
++
3540
++	for {
3541
++		select {
3542
++		case <-ticker.C:
3543
++			glog.V(4).Infof("Checking device %q is detached.", devicePath)
3544
++			if pathExists, err := volumeutil.PathExists(devicePath); err != nil {
3545
++				return fmt.Errorf("Error checking if device path exists: %v", err)
3546
++			} else if !pathExists {
3547
++				return nil
3548
++			}
3549
++		case <-timer.C:
3550
++			return fmt.Errorf("Timeout reached; Device %v is still attached", devicePath)
3551
++		}
3552
++	}
3553
++}
3554
++
3555
++// UnmountDevice unmounts the disk specified by the device mount path.
3556
++func (detacher *cascadeDiskDetacher) UnmountDevice(deviceMountPath string) error {
3557
++	return volumeutil.UnmountPath(deviceMountPath, detacher.mounter)
3558
++}
3559
++
3560
++func (plugin *cascadeDiskPlugin) NewDeviceMounter() (volume.DeviceMounter, error) {
3561
++	return plugin.NewAttacher()
3562
++}
3563
++
3564
++func(plugin *cascadeDiskPlugin) NewDeviceUnmounter() (volume.DeviceUnmounter, error){
3565
++	return plugin.NewDetacher()
3566
++}
3567
++
3568
+diff --git a/pkg/volume/cascade_disk/azure_disk_util.go b/pkg/volume/cascade_disk/azure_disk_util.go
3569
+new file mode 100644
3570
+index 0000000..7f9812f
3571
+--- /dev/null
3572
+@@ -0,0 +1,135 @@
3573
++package cascade_disk
3574
++
3575
++import (
3576
++	"io/ioutil"
3577
++	"os"
3578
++	"path"
3579
++	"strconv"
3580
++	"strings"
3581
++
3582
++	"github.com/golang/glog"
3583
++)
3584
++
3585
++const (
3586
++	environmentFilePath = "/etc/kubernetes/environment"
3587
++	diskPath            = "/dev/disk/cloud/"
3588
++	sysPath             = "/sys/bus/scsi/devices"
3589
++	lunIndex            = 3
3590
++	maxOsScsiHostNo     = 3
3591
++	vendor              = "vendor"
3592
++	msftVendor          = "MSFT"
3593
++	model               = "model"
3594
++	vhdModel            = "VIRTUAL DISK"
3595
++	block               = "block"
3596
++)
3597
++
3598
++func findAzureVolume(lun int) (device string, err error) {
3599
++	azureDisks := listAzureDiskPath()
3600
++	return findDiskByLunWithConstraint(lun, azureDisks)
3601
++}
3602
++
3603
++// List all the devices that are used by azure.
3604
++// All these devices are the symbolic link under /dev/disk/cloud/
3605
++// eg. azure_resource -> ../../sdb
3606
++func listAzureDiskPath() []string {
3607
++	var azureDiskList []string
3608
++	if dirs, err := ioutil.ReadDir(diskPath); err == nil {
3609
++		for _, f := range dirs {
3610
++			name := f.Name()
3611
++			diskPath := diskPath + name
3612
++			if link, linkErr := os.Readlink(diskPath); linkErr == nil {
3613
++				sd := link[(strings.LastIndex(link, "/") + 1):]
3614
++				azureDiskList = append(azureDiskList, sd)
3615
++			}
3616
++		}
3617
++	}
3618
++	glog.V(12).Infof("Azure sys disks paths: %v", azureDiskList)
3619
++	return azureDiskList
3620
++}
3621
++
3622
++// Azure attach/detach APIs return the disk model that does not have disk
3623
++// device path name (eg. /dev/sde) instead it gives the lun number of the disk
3624
++// getting attached/detached.
3625
++// This function maps that lun number to device path name of the
3626
++// device mounted to "current" node.
3627
++// Refrence : https://github.com/kubernetes/kubernetes/blob/master/pkg/volume/azure_dd/azure_common_linux.go#L69
3628
++//            https://docs.microsoft.com/en-us/azure/virtual-machines/linux/troubleshoot-device-names-problems
3629
++func findDiskByLunWithConstraint(lun int, azureDisks []string) (string, error) {
3630
++	var err error
3631
++	if dirs, err := ioutil.ReadDir(sysPath); err == nil {
3632
++		for _, f := range dirs {
3633
++			name := f.Name()
3634
++			// look for path like /sys/bus/scsi/devices/3:0:0:1
3635
++			arr := strings.Split(name, ":")
3636
++			if len(arr) < 4 {
3637
++				continue
3638
++			}
3639
++			if len(azureDisks) == 0 {
3640
++				glog.V(4).Infof("/dev/disk/cloud is not populated, now try to parse %v directly", name)
3641
++				target, err := strconv.Atoi(arr[0])
3642
++				if err != nil {
3643
++					glog.Errorf("failed to parse target from %v (%v), err %v", arr[0], name, err)
3644
++					continue
3645
++				}
3646
++				// as observed, targets 0-3 are used by OS disks. Skip them
3647
++				if target <= maxOsScsiHostNo {
3648
++					continue
3649
++				}
3650
++			}
3651
++
3652
++			// extract LUN from the path.
3653
++			// LUN is the last index of the array, i.e. 1 in /sys/bus/scsi/devices/3:0:0:1
3654
++			l, err := strconv.Atoi(arr[lunIndex])
3655
++			if err != nil {
3656
++				// unknown path format, continue to read the next one
3657
++				glog.V(4).Infof("azure disk - failed to parse lun from %v (%v), err %v", arr[lunIndex], name, err)
3658
++				continue
3659
++			}
3660
++			if lun == l {
3661
++				// find the matching LUN
3662
++				// read vendor and model to ensure it is a VHD disk
3663
++				vendorPath := path.Join(sysPath, name, vendor)
3664
++				vendorBytes, err := ioutil.ReadFile(vendorPath)
3665
++				if err != nil {
3666
++					glog.Errorf("failed to read device vendor, err: %v", err)
3667
++					continue
3668
++				}
3669
++				vendor := strings.TrimSpace(string(vendorBytes))
3670
++				if strings.ToUpper(vendor) != msftVendor {
3671
++					glog.V(4).Infof("vendor doesn't match VHD, got %s", vendor)
3672
++					continue
3673
++				}
3674
++
3675
++				modelPath := path.Join(sysPath, name, model)
3676
++				modelBytes, err := ioutil.ReadFile(modelPath)
3677
++				if err != nil {
3678
++					glog.Errorf("failed to read device model, err: %v", err)
3679
++					continue
3680
++				}
3681
++				model := strings.TrimSpace(string(modelBytes))
3682
++				if strings.ToUpper(model) != vhdModel {
3683
++					glog.V(4).Infof("model doesn't match VHD, got %s", model)
3684
++					continue
3685
++				}
3686
++
3687
++				// find a disk, validate name
3688
++				dir := path.Join(sysPath, name, block)
3689
++				if dev, err := ioutil.ReadDir(dir); err == nil {
3690
++					found := false
3691
++					devName := dev[0].Name()
3692
++					for _, diskName := range azureDisks {
3693
++						glog.V(12).Infof("azureDisk - validating disk %q with sys disk %q", devName, diskName)
3694
++						if devName == diskName {
3695
++							found = true
3696
++							break
3697
++						}
3698
++					}
3699
++					if !found {
3700
++						return "/dev/" + devName, nil
3701
++					}
3702
++				}
3703
++			}
3704
++		}
3705
++	}
3706
++	return "", err
3707
++}
3708
+diff --git a/pkg/volume/cascade_disk/cascade_disk.go b/pkg/volume/cascade_disk/cascade_disk.go
3709
+new file mode 100644
3710
+index 0000000..b7d3fd7
3711
+--- /dev/null
3712
+@@ -0,0 +1,399 @@
3713
++package cascade_disk
3714
++
3715
++import (
3716
++	"fmt"
3717
++	"os"
3718
++	"path"
3719
++
3720
++	"github.com/golang/glog"
3721
++	"k8s.io/api/core/v1"
3722
++	"k8s.io/apimachinery/pkg/api/resource"
3723
++	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3724
++	"k8s.io/apimachinery/pkg/types"
3725
++	"k8s.io/kubernetes/pkg/util/mount"
3726
++	utilstrings "k8s.io/kubernetes/pkg/util/strings"
3727
++	"k8s.io/kubernetes/pkg/volume"
3728
++	"k8s.io/kubernetes/pkg/volume/util"
3729
++)
3730
++
3731
++// This is the primary entrypoint for volume plugins.
3732
++func ProbeVolumePlugins() []volume.VolumePlugin {
3733
++	return []volume.VolumePlugin{&cascadeDiskPlugin{}}
3734
++}
3735
++
3736
++type cascadeDiskPlugin struct {
3737
++	host volume.VolumeHost
3738
++}
3739
++
3740
++var _ volume.VolumePlugin = &cascadeDiskPlugin{}
3741
++var _ volume.PersistentVolumePlugin = &cascadeDiskPlugin{}
3742
++var _ volume.DeletableVolumePlugin = &cascadeDiskPlugin{}
3743
++var _ volume.ProvisionableVolumePlugin = &cascadeDiskPlugin{}
3744
++
3745
++const (
3746
++	cascadeDiskPluginName = "kubernetes.io/vke-disk"
3747
++)
3748
++
3749
++// Init initializes the Cascade volume plugin.
3750
++func (plugin *cascadeDiskPlugin) Init(host volume.VolumeHost) error {
3751
++	plugin.host = host
3752
++	return nil
3753
++}
3754
++
3755
++// GetPluginName returns the name of the Cascade volume plugin.
3756
++func (plugin *cascadeDiskPlugin) GetPluginName() string {
3757
++	return cascadeDiskPluginName
3758
++}
3759
++
3760
++// GetVolumeName returns the name of the volume which is the diskID in our case.
3761
++func (plugin *cascadeDiskPlugin) GetVolumeName(spec *volume.Spec) (string, error) {
3762
++	volumeSource, _, err := getVolumeSource(spec)
3763
++	if err != nil {
3764
++		glog.Errorf("Cascade volume plugin: GetVolumeName failed to get volume source")
3765
++		return "", err
3766
++	}
3767
++
3768
++	return volumeSource.DiskID, nil
3769
++}
3770
++
3771
++// CanSupport specifies whether the Cascade volume plguin can support the specific resource type.
3772
++// Cascade plugin only supports the persistent volume and volume resource which has the Cascade disk annotation.
3773
++func (plugin *cascadeDiskPlugin) CanSupport(spec *volume.Spec) bool {
3774
++	return (spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CascadeDisk != nil) ||
3775
++		(spec.Volume != nil && spec.Volume.CascadeDisk != nil)
3776
++}
3777
++
3778
++// RequiresRemount specifies whether remount is required for the disk.
3779
++func (plugin *cascadeDiskPlugin) RequiresRemount() bool {
3780
++	return false
3781
++}
3782
++
3783
++// SupportsMountOption specifies whether the Cascade volume plugin supports the mount operation.
3784
++func (plugin *cascadeDiskPlugin) SupportsMountOption() bool {
3785
++	return true
3786
++}
3787
++
3788
++// SupportsBulkVolumeVerification specifies whether bulk volume verification is supported.
3789
++func (plugin *cascadeDiskPlugin) SupportsBulkVolumeVerification() bool {
3790
++	return false
3791
++}
3792
++
3793
++// NewMounter returns the mounter associated with the Cascade volume plugin.
3794
++func (plugin *cascadeDiskPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod,
3795
++	_ volume.VolumeOptions) (volume.Mounter, error) {
3796
++	return plugin.newMounterInternal(spec, pod.UID, &CascadeDiskUtil{}, plugin.host.GetMounter(plugin.GetPluginName()))
3797
++}
3798
++
3799
++// NewUnmounter returns the unmounter associated with the Cascade volume plugin.
3800
++func (plugin *cascadeDiskPlugin) NewUnmounter(volName string, podUID types.UID) (volume.Unmounter, error) {
3801
++	return plugin.newUnmounterInternal(volName, podUID, &CascadeDiskUtil{},
3802
++		plugin.host.GetMounter(plugin.GetPluginName()))
3803
++}
3804
++
3805
++func (plugin *cascadeDiskPlugin) newMounterInternal(spec *volume.Spec, podUID types.UID, manager diskManager,
3806
++	mounter mount.Interface) (volume.Mounter, error) {
3807
++	volumeSource, _, err := getVolumeSource(spec)
3808
++	if err != nil {
3809
++		glog.Errorf("Cascade volume plugin: newMounterInternal failed to get volume source")
3810
++		return nil, err
3811
++	}
3812
++
3813
++	diskID := volumeSource.DiskID
3814
++	fsType := volumeSource.FSType
3815
++
3816
++	return &cascadeDiskMounter{
3817
++		cascadeDisk: &cascadeDisk{
3818
++			podUID:  podUID,
3819
++			volName: spec.Name(),
3820
++			diskID:  diskID,
3821
++			manager: manager,
3822
++			mounter: mounter,
3823
++			plugin:  plugin,
3824
++		},
3825
++		fsType:      fsType,
3826
++		diskMounter: util.NewSafeFormatAndMountFromHost(plugin.GetPluginName(), plugin.host)}, nil
3827
++}
3828
++
3829
++func (plugin *cascadeDiskPlugin) newUnmounterInternal(volName string, podUID types.UID, manager diskManager,
3830
++	mounter mount.Interface) (volume.Unmounter, error) {
3831
++	return &cascadeDiskUnmounter{
3832
++		&cascadeDisk{
3833
++			podUID:  podUID,
3834
++			volName: volName,
3835
++			manager: manager,
3836
++			mounter: mounter,
3837
++			plugin:  plugin,
3838
++		}}, nil
3839
++}
3840
++
3841
++// ConstructVolumeSpec constructs a Cascade volume spec based on the name and mount path.
3842
++func (plugin *cascadeDiskPlugin) ConstructVolumeSpec(volumeSpecName, mountPath string) (*volume.Spec, error) {
3843
++	mounter := plugin.host.GetMounter(plugin.GetPluginName())
3844
++	pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName())
3845
++	diskID, err := mounter.GetDeviceNameFromMount(mountPath, pluginDir)
3846
++	if err != nil {
3847
++		return nil, err
3848
++	}
3849
++
3850
++	cascadeDisk := &v1.Volume{
3851
++		Name: volumeSpecName,
3852
++		VolumeSource: v1.VolumeSource{
3853
++			CascadeDisk: &v1.CascadeDiskVolumeSource{
3854
++				DiskID: diskID,
3855
++			},
3856
++		},
3857
++	}
3858
++	return volume.NewSpecFromVolume(cascadeDisk), nil
3859
++}
3860
++
3861
++// Abstract interface to disk operations.
3862
++type diskManager interface {
3863
++	// Creates a volume
3864
++	CreateVolume(provisioner *cascadeDiskProvisioner) (diskID string, volumeSizeGB int, labels map[string]string, fstype string, err error)
3865
++	// Deletes a volume
3866
++	DeleteVolume(deleter *cascadeDiskDeleter) error
3867
++}
3868
++
3869
++// cascadeDisk volumes are disk resources attached to the kubelet's host machine and exposed to the pod.
3870
++type cascadeDisk struct {
3871
++	volName string
3872
++	podUID  types.UID
3873
++	diskID  string
3874
++	fsType  string
3875
++	manager diskManager
3876
++	mounter mount.Interface
3877
++	plugin  *cascadeDiskPlugin
3878
++	volume.MetricsNil
3879
++}
3880
++
3881
++var _ volume.Mounter = &cascadeDiskMounter{}
3882
++
3883
++type cascadeDiskMounter struct {
3884
++	*cascadeDisk
3885
++	fsType      string
3886
++	diskMounter *mount.SafeFormatAndMount
3887
++}
3888
++
3889
++// GetAttributes returns the attributes associated with a Cascade disk.
3890
++func (b *cascadeDiskMounter) GetAttributes() volume.Attributes {
3891
++	return volume.Attributes{
3892
++		SupportsSELinux: true,
3893
++	}
3894
++}
3895
++
3896
++// CanMount checks prior to mount operations to verify that the required components (binaries, etc.) to mount the
3897
++// volume are available on the underlying node. If not, it returns an error.
3898
++func (b *cascadeDiskMounter) CanMount() error {
3899
++	return nil
3900
++}
3901
++
3902
++// SetUp attaches the disk and bind mounts to the volume path.
3903
++func (b *cascadeDiskMounter) SetUp(fsGroup *int64) error {
3904
++	return b.SetUpAt(b.GetPath(), fsGroup)
3905
++}
3906
++
3907
++// SetUpAt attaches the disk and bind mounts to the volume path.
3908
++func (b *cascadeDiskMounter) SetUpAt(dir string, fsGroup *int64) error {
3909
++	glog.V(4).Infof("Cascade Persistent Disk setup %s to %s", b.diskID, dir)
3910
++
3911
++	// TODO: handle failed mounts here.
3912
++	notmnt, err := b.mounter.IsLikelyNotMountPoint(dir)
3913
++	if err != nil && !os.IsNotExist(err) {
3914
++		glog.Errorf("cannot validate mount point: %s %v", dir, err)
3915
++		return err
3916
++	}
3917
++	if !notmnt {
3918
++		return nil
3919
++	}
3920
++
3921
++	if err := os.MkdirAll(dir, 0750); err != nil {
3922
++		glog.Errorf("mkdir failed on disk %s (%v)", dir, err)
3923
++		return err
3924
++	}
3925
++
3926
++	options := []string{"bind"}
3927
++
3928
++	// Perform a bind mount to the full path to allow duplicate mounts of the same PD.
3929
++	globalPDPath := makeGlobalPDPath(b.plugin.host, b.diskID)
3930
++	glog.V(4).Infof("attempting to mount %s", dir)
3931
++
3932
++	err = b.mounter.Mount(globalPDPath, dir, "", options)
3933
++	if err != nil {
3934
++		notmnt, mntErr := b.mounter.IsLikelyNotMountPoint(dir)
3935
++		if mntErr != nil {
3936
++			glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr)
3937
++			return err
3938
++		}
3939
++		if !notmnt {
3940
++			if mntErr = b.mounter.Unmount(dir); mntErr != nil {
3941
++				glog.Errorf("Failed to unmount: %v", mntErr)
3942
++				return err
3943
++			}
3944
++			notmnt, mntErr := b.mounter.IsLikelyNotMountPoint(dir)
3945
++			if mntErr != nil {
3946
++				glog.Errorf("IsLikelyNotMountPoint check failed: %v", mntErr)
3947
++				return err
3948
++			}
3949
++			if !notmnt {
3950
++				glog.Errorf("%s is still mounted, despite call to unmount().  Will try again next sync loop.",
3951
++					b.GetPath())
3952
++				return err
3953
++			}
3954
++		}
3955
++		os.Remove(dir)
3956
++		glog.Errorf("Mount of disk %s failed: %v", dir, err)
3957
++		return err
3958
++	}
3959
++	volume.SetVolumeOwnership(b, fsGroup)
3960
++
3961
++	return nil
3962
++}
3963
++
3964
++var _ volume.Unmounter = &cascadeDiskUnmounter{}
3965
++
3966
++type cascadeDiskUnmounter struct {
3967
++	*cascadeDisk
3968
++}
3969
++
3970
++// TearDown unmounts the bind mount, and detaches the disk only if the disk resource was the last reference to that
3971
++// disk on the kubelet.
3972
++func (c *cascadeDiskUnmounter) TearDown() error {
3973
++	return c.TearDownAt(c.GetPath())
3974
++}
3975
++
3976
++// TearDownAt unmounts the bind mount, and detaches the disk only if the disk resource was the last reference to that
3977
++// disk on the kubelet.
3978
++func (c *cascadeDiskUnmounter) TearDownAt(dir string) error {
3979
++	return util.UnmountPath(dir, c.mounter)
3980
++}
3981
++
3982
++func makeGlobalPDPath(host volume.VolumeHost, diskID string) string {
3983
++	return path.Join(host.GetPluginDir(cascadeDiskPluginName), mount.MountsInGlobalPDPath, diskID)
3984
++}
3985
++
3986
++func (cd *cascadeDisk) GetPath() string {
3987
++	name := cascadeDiskPluginName
3988
++	return cd.plugin.host.GetPodVolumeDir(cd.podUID, utilstrings.EscapeQualifiedNameForDisk(name), cd.volName)
3989
++}
3990
++
3991
++func (plugin *cascadeDiskPlugin) GetAccessModes() []v1.PersistentVolumeAccessMode {
3992
++	return []v1.PersistentVolumeAccessMode{
3993
++		v1.ReadWriteOnce,
3994
++	}
3995
++}
3996
++
3997
++type cascadeDiskDeleter struct {
3998
++	*cascadeDisk
3999
++}
4000
++
4001
++var _ volume.Deleter = &cascadeDiskDeleter{}
4002
++
4003
++// NewDeleter returns the deleter associated with the Cascade volume plugin.
4004
++func (plugin *cascadeDiskPlugin) NewDeleter(spec *volume.Spec) (volume.Deleter, error) {
4005
++	return plugin.newDeleterInternal(spec, &CascadeDiskUtil{})
4006
++}
4007
++
4008
++func (plugin *cascadeDiskPlugin) newDeleterInternal(spec *volume.Spec, manager diskManager) (volume.Deleter, error) {
4009
++	if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CascadeDisk == nil {
4010
++		return nil, fmt.Errorf("spec.PersistentVolumeSource.CascadeDisk is nil")
4011
++	}
4012
++	return &cascadeDiskDeleter{
4013
++		&cascadeDisk{
4014
++			volName: spec.Name(),
4015
++			diskID:  spec.PersistentVolume.Spec.CascadeDisk.DiskID,
4016
++			manager: manager,
4017
++			plugin:  plugin,
4018
++		}}, nil
4019
++}
4020
++
4021
++func (r *cascadeDiskDeleter) Delete() error {
4022
++	return r.manager.DeleteVolume(r)
4023
++}
4024
++
4025
++type cascadeDiskProvisioner struct {
4026
++	*cascadeDisk
4027
++	options volume.VolumeOptions
4028
++}
4029
++
4030
++var _ volume.Provisioner = &cascadeDiskProvisioner{}
4031
++
4032
++// NewProvisioner returns the provisioner associated with the Cascade volume plugin.
4033
++func (plugin *cascadeDiskPlugin) NewProvisioner(options volume.VolumeOptions) (volume.Provisioner, error) {
4034
++	return plugin.newProvisionerInternal(options, &CascadeDiskUtil{})
4035
++}
4036
++
4037
++func (plugin *cascadeDiskPlugin) newProvisionerInternal(options volume.VolumeOptions,
4038
++	manager diskManager) (volume.Provisioner, error) {
4039
++	return &cascadeDiskProvisioner{
4040
++		cascadeDisk: &cascadeDisk{
4041
++			manager: manager,
4042
++			plugin:  plugin,
4043
++		},
4044
++		options: options,
4045
++	}, nil
4046
++}
4047
++
4048
++// Provision provisions the persistent volume by making a CreateDisk call to Cascade Controller.
4049
++func (p *cascadeDiskProvisioner) Provision(selectedNode *v1.Node, allowedTopologies []v1.TopologySelectorTerm) (*v1.PersistentVolume, error) {
4050
++	if !util.AccessModesContainedInAll(p.plugin.GetAccessModes(), p.options.PVC.Spec.AccessModes) {
4051
++		return nil, fmt.Errorf("invalid AccessModes %v: only AccessModes %v are supported",
4052
++			p.options.PVC.Spec.AccessModes, p.plugin.GetAccessModes())
4053
++	}
4054
++
4055
++	diskID, sizeGB, labels, fstype, err := p.manager.CreateVolume(p)
4056
++	if err != nil {
4057
++		return nil, err
4058
++	}
4059
++
4060
++	if fstype == "" {
4061
++		fstype = "ext4"
4062
++	}
4063
++
4064
++	pv := &v1.PersistentVolume{
4065
++		ObjectMeta: metav1.ObjectMeta{
4066
++			Name:   p.options.PVName,
4067
++			Labels: map[string]string{},
4068
++			Annotations: map[string]string{
4069
++				util.VolumeDynamicallyCreatedByKey: "vke-volume-dynamic-provisioner",
4070
++			},
4071
++		},
4072
++		Spec: v1.PersistentVolumeSpec{
4073
++			PersistentVolumeReclaimPolicy: p.options.PersistentVolumeReclaimPolicy,
4074
++			AccessModes:                   p.options.PVC.Spec.AccessModes,
4075
++			Capacity: v1.ResourceList{
4076
++				v1.ResourceName(v1.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)),
4077
++			},
4078
++			PersistentVolumeSource: v1.PersistentVolumeSource{
4079
++				CascadeDisk: &v1.CascadeDiskVolumeSource{
4080
++					DiskID: diskID,
4081
++					FSType: fstype,
4082
++				},
4083
++			},
4084
++			MountOptions: p.options.MountOptions,
4085
++		},
4086
++	}
4087
++	if len(p.options.PVC.Spec.AccessModes) == 0 {
4088
++		pv.Spec.AccessModes = p.plugin.GetAccessModes()
4089
++	}
4090
++
4091
++	if len(labels) != 0 {
4092
++		if pv.Labels == nil {
4093
++			pv.Labels = make(map[string]string)
4094
++		}
4095
++		for k, v := range labels {
4096
++			pv.Labels[k] = v
4097
++		}
4098
++	}
4099
++
4100
++	return pv, nil
4101
++}
4102
++
4103
++func getVolumeSource(spec *volume.Spec) (*v1.CascadeDiskVolumeSource, bool, error) {
4104
++	if spec.Volume != nil && spec.Volume.CascadeDisk != nil {
4105
++		return spec.Volume.CascadeDisk, spec.ReadOnly, nil
4106
++	} else if spec.PersistentVolume != nil && spec.PersistentVolume.Spec.CascadeDisk != nil {
4107
++		return spec.PersistentVolume.Spec.CascadeDisk, spec.ReadOnly, nil
4108
++	}
4109
++
4110
++	return nil, false, fmt.Errorf("Spec does not reference a Cascade disk type")
4111
++}
4112
+diff --git a/pkg/volume/cascade_disk/cascade_util.go b/pkg/volume/cascade_disk/cascade_util.go
4113
+new file mode 100644
4114
+index 0000000..5ad0bc9
4115
+--- /dev/null
4116
+@@ -0,0 +1,217 @@
4117
++package cascade_disk
4118
++
4119
++import (
4120
++	"fmt"
4121
++	"os"
4122
++	"path/filepath"
4123
++	"strconv"
4124
++	"strings"
4125
++	"time"
4126
++
4127
++	"github.com/golang/glog"
4128
++	"k8s.io/api/core/v1"
4129
++	"k8s.io/kubernetes/pkg/cloudprovider"
4130
++	"k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
4131
++	"k8s.io/kubernetes/pkg/volume"
4132
++	volumeutil "k8s.io/kubernetes/pkg/volume/util"
4133
++	"bufio"
4134
++)
4135
++
4136
++const (
4137
++	checkSleepDuration = time.Second
4138
++)
4139
++
4140
++type CascadeDiskUtil struct{}
4141
++
4142
++func verifyDevicePath(path string) (string, error) {
4143
++	if pathExists, err := volumeutil.PathExists(path); err != nil {
4144
++		return "", fmt.Errorf("Error checking if path exists: %v", err)
4145
++	} else if pathExists {
4146
++		return path, nil
4147
++	}
4148
++
4149
++	glog.V(4).Infof("verifyDevicePath: path does not exist yet")
4150
++	return "", nil
4151
++}
4152
++
4153
++// Returns path for given VKE disk mount
4154
++func getDiskByIdPath(devicePath string) string {
4155
++	provider, err := getProvider()
4156
++	if err != nil {
4157
++		glog.Warningf("error getting provider name from %s: %v", environmentFilePath, err)
4158
++		return devicePath
4159
++	}
4160
++
4161
++	switch provider {
4162
++	case "azure":
4163
++		// devicePath is an integer then it is lun returned from azure attach disk.
4164
++		if diskLun, err := strconv.Atoi(devicePath); err == nil {
4165
++			azDevicePath, err := findAzureVolume(diskLun)
4166
++			if err != nil {
4167
++				glog.Warningf("error looking for azure volume %q: %v", devicePath, err)
4168
++			} else if azDevicePath != "" {
4169
++				devicePath = azDevicePath
4170
++			}
4171
++		} else {
4172
++			glog.Warningf("The device path for azure expected to be an integer but it is %s. Error : %v", devicePath, err)
4173
++		}
4174
++	default:
4175
++		nvmePath, err := findNvmeVolume(devicePath)
4176
++		if err != nil {
4177
++			glog.Warningf("error looking for nvme volume %q: %v", devicePath, err)
4178
++		} else if nvmePath != "" {
4179
++			devicePath = nvmePath
4180
++		}
4181
++	}
4182
++	return devicePath
4183
++}
4184
++
4185
++// CreateVolume creates a Cascade persistent disk.
4186
++func (util *CascadeDiskUtil) CreateVolume(p *cascadeDiskProvisioner) (string, int, map[string]string, string, error) {
4187
++
4188
++	cloud, err := getCloudProvider(p.plugin.host.GetCloudProvider())
4189
++	if err != nil {
4190
++		glog.Errorf("CreateVolume failed to get cloud provider. Error [%v]", err)
4191
++		return "", 0, nil, "", err
4192
++	}
4193
++
4194
++	capacity := p.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)]
4195
++	volSizeBytes := capacity.Value()
4196
++	// Cascade works with GB, convert to GB with rounding up
4197
++	volSizeGB := int(volumeutil.RoundUpSize(volSizeBytes, 1024*1024*1024))
4198
++	name := volumeutil.GenerateVolumeName(p.options.ClusterName, p.options.PVName, 255)
4199
++	volumeOptions := &cascade.VolumeOptions{
4200
++		CapacityGB: volSizeGB,
4201
++		Tags:       *p.options.CloudTags,
4202
++		Name:       name,
4203
++	}
4204
++	fstype := ""
4205
++	// enabling encryption by default if not provided from within storage class
4206
++	volumeOptions.Encrypted = true
4207
++	for parameter, value := range p.options.Parameters {
4208
++		switch strings.ToLower(parameter) {
4209
++		case "type":
4210
++			volumeOptions.Type = value
4211
++		case "zone":
4212
++			volumeOptions.ZonePresent = true
4213
++			volumeOptions.AvailabilityZone = value
4214
++		case "zones":
4215
++			volumeOptions.ZonesPresent = true
4216
++			volumeOptions.AvailabilityZones = value
4217
++		case "encrypted":
4218
++			volumeOptions.Encrypted, err = strconv.ParseBool(value)
4219
++			if err != nil {
4220
++				glog.Errorf("invalid value %q for encryption of volume plugin %s.", value, p.plugin.GetPluginName())
4221
++				return "", 0, nil, "",
4222
++					fmt.Errorf("invalid encrypted boolean value %q, must be true or false: %v", value, err)
4223
++			}
4224
++		case volume.VolumeParameterFSType:
4225
++			fstype = value
4226
++			glog.V(4).Infof("Setting fstype to %s", fstype)
4227
++		default:
4228
++			glog.Errorf("invalid option %s for volume plugin %s.", parameter,
4229
++				p.plugin.GetPluginName())
4230
++			return "", 0, nil, "",
4231
++				fmt.Errorf("invalid option %s for volume plugin %s.", parameter, p.plugin.GetPluginName())
4232
++		}
4233
++	}
4234
++
4235
++	if volumeOptions.ZonePresent && volumeOptions.ZonesPresent {
4236
++		return "", 0, nil, "", fmt.Errorf("both zone and zones StorageClass parameters must not be used at the same time")
4237
++	}
4238
++
4239
++	diskID, err := cloud.CreateDisk(volumeOptions)
4240
++	if err != nil {
4241
++		glog.Errorf("failed to CreateDisk. Error [%v]", err)
4242
++		return "", 0, nil, "", err
4243
++	}
4244
++
4245
++	labels, err := cloud.GetVolumeLabels(diskID)
4246
++	if err != nil {
4247
++		// We don't really want to leak the volume here...
4248
++		glog.Errorf("error building labels for new volume %q: %v", name, err)
4249
++	}
4250
++
4251
++	glog.V(4).Infof("Successfully created Cascade persistent disk %s", name)
4252
++	return diskID, volSizeGB, labels, fstype, nil
4253
++}
4254
++
4255
++// DeleteVolume deletes a Cascade volume.
4256
++func (util *CascadeDiskUtil) DeleteVolume(disk *cascadeDiskDeleter) error {
4257
++	cloud, err := getCloudProvider(disk.plugin.host.GetCloudProvider())
4258
++	if err != nil {
4259
++		glog.Errorf("DeleteVolume failed to get cloud provider. Error [%v]", err)
4260
++		return err
4261
++	}
4262
++
4263
++	if err = cloud.DeleteDisk(disk.diskID); err != nil {
4264
++		glog.Errorf("failed to DeleteDisk for diskID %s. Error [%v]", disk.diskID, err)
4265
++		return err
4266
++	}
4267
++
4268
++	glog.V(4).Infof("Successfully deleted Cascade persistent disk %s", disk.diskID)
4269
++	return nil
4270
++}
4271
++
4272
++func getCloudProvider(cloud cloudprovider.Interface) (*cascade.CascadeCloud, error) {
4273
++	if cloud == nil {
4274
++		glog.Errorf("Cloud provider not initialized properly")
4275
++		return nil, fmt.Errorf("Cloud provider not initialized properly")
4276
++	}
4277
++
4278
++	cc := cloud.(*cascade.CascadeCloud)
4279
++	if cc == nil {
4280
++		glog.Errorf("Invalid cloud provider: expected Cascade")
4281
++		return nil, fmt.Errorf("Invalid cloud provider: expected Cascade")
4282
++	}
4283
++	return cc, nil
4284
++}
4285
++
4286
++// findNvmeVolume looks for the nvme volume with the specified name
4287
++// It follows the symlink (if it exists) and returns the absolute path to the device
4288
++func findNvmeVolume(findName string) (device string, err error) {
4289
++	stat, err := os.Lstat(findName)
4290
++	if err != nil {
4291
++		if os.IsNotExist(err) {
4292
++			glog.V(6).Infof("nvme path not found %q", findName)
4293
++			return "", nil
4294
++		}
4295
++		return "", fmt.Errorf("error getting stat of %q: %v", findName, err)
4296
++	}
4297
++
4298
++	if stat.Mode()&os.ModeSymlink != os.ModeSymlink {
4299
++		glog.Warningf("nvme file %q found, but was not a symlink", findName)
4300
++		return "", nil
4301
++	}
4302
++
4303
++	// Find the target, resolving to an absolute path
4304
++	// For example, /dev/disk/by-id/nvme-Amazon_Elastic_Block_Store_vol0fab1d5e3f72a5e23 -> ../../nvme2n1
4305
++	resolved, err := filepath.EvalSymlinks(findName)
4306
++	if err != nil {
4307
++		return "", fmt.Errorf("error reading target of symlink %q: %v", findName, err)
4308
++	}
4309
++
4310
++	if !strings.HasPrefix(resolved, "/dev") {
4311
++		return "", fmt.Errorf("resolved symlink for %q was unexpected: %q", findName, resolved)
4312
++	}
4313
++
4314
++	return resolved, nil
4315
++}
4316
++
4317
++func getProvider() (provider string, err error) {
4318
++	file, err := os.Open(environmentFilePath)
4319
++	if err != nil {
4320
++		return "", err
4321
++	}
4322
++	defer file.Close()
4323
++
4324
++	scanner := bufio.NewScanner(file)
4325
++
4326
++	for scanner.Scan() {
4327
++		lineContent := scanner.Text()
4328
++		if strings.Contains(lineContent, "PROVIDER=") {
4329
++			return strings.SplitAfter(lineContent, "=")[1], err
4330
++		}
4331
++	}
4332
++	return "", err
4333
++}
4334
+diff --git a/plugin/pkg/admission/storage/persistentvolume/label/admission.go b/plugin/pkg/admission/storage/persistentvolume/label/admission.go
4335
+index 4bbd16f..ff5a911 100644
4336
+--- a/plugin/pkg/admission/storage/persistentvolume/label/admission.go
4337
+@@ -29,6 +29,7 @@ import (
4338
+ 	"k8s.io/kubernetes/pkg/cloudprovider"
4339
+ 	"k8s.io/kubernetes/pkg/cloudprovider/providers/aws"
4340
+ 	"k8s.io/kubernetes/pkg/cloudprovider/providers/azure"
4341
++	"k8s.io/kubernetes/pkg/cloudprovider/providers/cascade"
4342
+ 	"k8s.io/kubernetes/pkg/cloudprovider/providers/gce"
4343
+ 	"k8s.io/kubernetes/pkg/features"
4344
+ 	kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
4345
+@@ -60,6 +61,7 @@ type persistentVolumeLabel struct {
4346
+ 	cloudConfig      []byte
4347
+ 	gceCloudProvider *gce.GCECloud
4348
+ 	azureProvider    *azure.Cloud
4349
++	cascadeDisks     cascade.Disks
4350
+ }
4351
+ 
4352
+ var _ admission.MutationInterface = &persistentVolumeLabel{}
4353
+@@ -132,6 +134,13 @@ func (l *persistentVolumeLabel) Admit(a admission.Attributes) (err error) {
4354
+ 		}
4355
+ 		volumeLabels = labels
4356
+ 	}
4357
++	if volume.Spec.CascadeDisk != nil {
4358
++		labels, err := l.findCascadeDiskLabels(volume)
4359
++		if err != nil {
4360
++			return admission.NewForbidden(a, fmt.Errorf("error querying Cascade volume %s: %v", volume.Spec.CascadeDisk.DiskID, err))
4361
++		}
4362
++		volumeLabels = labels
4363
++	}
4364
+ 
4365
+ 	requirements := make([]api.NodeSelectorRequirement, 0)
4366
+ 	if len(volumeLabels) != 0 {
4367
+@@ -307,6 +316,51 @@ func (l *persistentVolumeLabel) getAzureCloudProvider() (*azure.Cloud, error) {
4368
+ 	return l.azureProvider, nil
4369
+ }
4370
+ 
4371
++func (l *persistentVolumeLabel) findCascadeDiskLabels(volume *api.PersistentVolume) (map[string]string, error) {
4372
++	// Ignore any volumes that are being provisioned
4373
++	if volume.Spec.CascadeDisk.DiskID == vol.ProvisionedVolumeName {
4374
++		return nil, nil
4375
++	}
4376
++	cascadeDisks, err := l.getCascadeDisks()
4377
++	if err != nil {
4378
++		return nil, err
4379
++	}
4380
++	if cascadeDisks == nil {
4381
++		return nil, fmt.Errorf("unable to build Cascade cloud provider for volumes")
4382
++	}
4383
++
4384
++	labels, err := cascadeDisks.GetVolumeLabels(volume.Spec.CascadeDisk.DiskID)
4385
++	if err != nil {
4386
++		return nil, err
4387
++	}
4388
++
4389
++	return labels, nil
4390
++}
4391
++
4392
++// getCascadeDisks returns the Cascade Disks interface
4393
++func (l *persistentVolumeLabel) getCascadeDisks() (cascade.Disks, error) {
4394
++	l.mutex.Lock()
4395
++	defer l.mutex.Unlock()
4396
++
4397
++	if l.cascadeDisks == nil {
4398
++		var cloudConfigReader io.Reader
4399
++		if len(l.cloudConfig) > 0 {
4400
++			cloudConfigReader = bytes.NewReader(l.cloudConfig)
4401
++		}
4402
++		cloudProvider, err := cloudprovider.GetCloudProvider("vke", cloudConfigReader)
4403
++		if err != nil || cloudProvider == nil {
4404
++			return nil, err
4405
++		}
4406
++		provider, ok := cloudProvider.(*cascade.CascadeCloud)
4407
++		if !ok {
4408
++			// GetCloudProvider has gone very wrong
4409
++			return nil, fmt.Errorf("error retrieving Cascade cloud provider")
4410
++		}
4411
++		l.cascadeDisks = provider
4412
++	}
4413
++	return l.cascadeDisks, nil
4414
++}
4415
++
4416
+ func (l *persistentVolumeLabel) findAzureDiskLabels(volume *api.PersistentVolume) (map[string]string, error) {
4417
+ 	// Ignore any volumes that are being provisioned
4418
+ 	if volume.Spec.AzureDisk.DiskName == vol.ProvisionedVolumeName {
4419
+diff --git a/plugin/pkg/admission/vke/BUILD b/plugin/pkg/admission/vke/BUILD
4420
+new file mode 100644
4421
+index 0000000..530877a
4422
+--- /dev/null
4423
+@@ -0,0 +1,61 @@
4424
++package(default_visibility = ["//visibility:public"])
4425
++
4426
++load(
4427
++    "@io_bazel_rules_go//go:def.bzl",
4428
++    "go_library",
4429
++)
4430
++
4431
++go_library(
4432
++    name = "go_default_library",
4433
++    srcs = ["admission.go"],
4434
++    importpath = "k8s.io/kubernetes/plugin/pkg/admission/vke",
4435
++    deps = [
4436
++        "//pkg/apis/core:go_default_library",
4437
++        "//pkg/apis/extensions:go_default_library",
4438
++        "//pkg/apis/policy/v1beta1:go_default_library",
4439
++        "//pkg/apis/rbac:go_default_library",
4440
++        "//pkg/registry/rbac:go_default_library",
4441
++        "//pkg/security/podsecuritypolicy:go_default_library",
4442
++        "//vendor/github.com/golang/glog:go_default_library",
4443
++        "//vendor/k8s.io/api/policy/v1beta1:go_default_library"
4444
++        "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
4445
++        "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
4446
++        "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
4447
++        "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
4448
++        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
4449
++        "//vendor/k8s.io/apiserver/pkg/admission:go_default_library",
4450
++    ],
4451
++)
4452
++
4453
++go_test(
4454
++    name = "go_default_test",
4455
++    srcs = ["admission_test.go"],
4456
++    embed = [":go_default_library"],
4457
++    deps = [
4458
++        "//pkg/apis/core:go_default_library",
4459
++        "//pkg/apis/extensions:go_default_library",
4460
++        "//pkg/apis/rbac:go_default_library",
4461
++        "//pkg/registry/rbac:go_default_library",
4462
++        "//pkg/security/podsecuritypolicy:go_default_library",
4463
++        "//vendor/github.com/golang/glog:go_default_library",
4464
++        "//vendor/github.com/stretchr/testify/assert:go_default_library",
4465
++        "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
4466
++        "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
4467
++        "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
4468
++        "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
4469
++        "//vendor/k8s.io/apiserver/pkg/admission:go_default_library",
4470
++    ],
4471
++)
4472
++
4473
++filegroup(
4474
++    name = "package-srcs",
4475
++    srcs = glob(["**"]),
4476
++    tags = ["automanaged"],
4477
++    visibility = ["//visibility:private"],
4478
++)
4479
++
4480
++filegroup(
4481
++    name = "all-srcs",
4482
++    srcs = [":package-srcs"],
4483
++    tags = ["automanaged"],
4484
++)
4485
+\ No newline at end of file
4486
+diff --git a/plugin/pkg/admission/vke/admission.go b/plugin/pkg/admission/vke/admission.go
4487
+new file mode 100644
4488
+index 0000000..c1e6ba5
4489
+--- /dev/null
4490
+@@ -0,0 +1,662 @@
4491
++package vke
4492
++
4493
++import (
4494
++	"fmt"
4495
++	"io"
4496
++	"os"
4497
++	"strings"
4498
++
4499
++	"github.com/golang/glog"
4500
++	"k8s.io/api/policy/v1beta1"
4501
++	apiequality "k8s.io/apimachinery/pkg/api/equality"
4502
++	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
4503
++	"k8s.io/apimachinery/pkg/util/validation/field"
4504
++	"k8s.io/apimachinery/pkg/util/yaml"
4505
++	"k8s.io/apiserver/pkg/admission"
4506
++	api "k8s.io/kubernetes/pkg/apis/core"
4507
++	"k8s.io/kubernetes/pkg/apis/policy"
4508
++	policybeta "k8s.io/kubernetes/pkg/apis/policy/v1beta1"
4509
++	"k8s.io/kubernetes/pkg/apis/rbac"
4510
++	rbacregistry "k8s.io/kubernetes/pkg/registry/rbac"
4511
++	"k8s.io/kubernetes/pkg/security/podsecuritypolicy"
4512
++)
4513
++
4514
++const (
4515
++	// PluginName indicates name of admission plugin.
4516
++	PluginName = "VMwareAdmissionController"
4517
++
4518
++	systemNodesGroup         = "system:nodes"
4519
++	systemMastersGroup       = "system:masters"
4520
++	systemWorkerGroup        = "system:worker"
4521
++	privilegedNamespace      = "vke-system"
4522
++	privilegedServiceAccount = "system:serviceaccount:" + privilegedNamespace + ":"
4523
++	reservedPrefix           = "vke"
4524
++	reservedTolerationKey    = "Dedicated"
4525
++	reservedTolerationValue  = "Master"
4526
++	masterNodePrefix         = "master"
4527
++	etcSslCerts              = "/etc/ssl/certs"
4528
++)
4529
++
4530
++// Register registers a plugin.
4531
++func Register(plugins *admission.Plugins) {
4532
++	plugins.Register(PluginName, func(config io.Reader) (admission.Interface, error) {
4533
++		return NewVMwareAdmissionController(config)
4534
++	})
4535
++}
4536
++
4537
++// vmwareAdmissionController is an implementation of admission.Interface.
4538
++// It restricts access to VKE namespace for users and prevents the users from creating privileged pods.
4539
++type vmwareAdmissionController struct {
4540
++	psp             *policy.PodSecurityPolicy
4541
++	strategyFactory podsecuritypolicy.StrategyFactory
4542
++	privilegedGroup string
4543
++	clusterID       string
4544
++	privilegedMode  bool
4545
++}
4546
++
4547
++// vmwareAdmissionControllerConfig holds config data for VMwareAdmissionController.
4548
++type vmwareAdmissionControllerConfig struct {
4549
++	ClusterID             string `yaml:"clusterID"`
4550
++	PrivilegedGroup       string `yaml:"privilegedGroup"`
4551
++	PodSecurityPolicyFile string `yaml:"podSecurityPolicyFile"`
4552
++}
4553
++
4554
++// AdmissionConfig holds config data for admission controllers.
4555
++type AdmissionConfig struct {
4556
++	VMwareAdmissionController vmwareAdmissionControllerConfig `yaml:"vmwareAdmissionController"`
4557
++}
4558
++
4559
++var _ admission.MutationInterface = &vmwareAdmissionController{}
4560
++var _ admission.ValidationInterface = &vmwareAdmissionController{}
4561
++
4562
++// Admit makes an admission decision based on the request attributes.
4563
++// Note: We implement the mutation interface for this admission controller, which means we have the ability to modify
4564
++// the resources. But we do not modify them because we just need to validate the requests to either let them through or
4565
++// block them. We have implemented this mutation interface because we need access to oldObjects during update operations
4566
++// to find out what values are being modified. For node update operation, the old and new objects are always identical
4567
++// in the validation phase (possibly due to some initializer modifying it). So, we are performing this specific
4568
++// vaidation during the mutation phase.
4569
++func (vac *vmwareAdmissionController) Admit(a admission.Attributes) (err error) {
4570
++	if isPrivilegedServiceAccount(a) {
4571
++		return validatePrivilegedServiceAccount(a)
4572
++	}
4573
++
4574
++	return err
4575
++}
4576
++
4577
++// Validate makes an admission decision based on the request attributes.
4578
++func (vac *vmwareAdmissionController) Validate(a admission.Attributes) (err error) {
4579
++	if isPrivilegedUser(vac, a) {
4580
++		return nil
4581
++	}
4582
++
4583
++	if isCertificateFromMaster(a) {
4584
++		return validateCertificateFromMaster(vac, a)
4585
++	}
4586
++
4587
++	if isCertificateFromWorker(a) {
4588
++		return validateCertificateFromWorker(a)
4589
++	}
4590
++
4591
++	if isPrivilegedServiceAccount(a) {
4592
++		return validatePrivilegedServiceAccount(a)
4593
++	}
4594
++
4595
++	if isPrivilegedNamespace(a) {
4596
++		return admission.NewForbidden(a,
4597
++			fmt.Errorf("%s validation failed: cannot modify resources in namespace %s", PluginName, a.GetNamespace()))
4598
++	}
4599
++
4600
++	switch a.GetResource().GroupResource() {
4601
++	case api.Resource("pods"):
4602
++		err = validatePods(vac, a)
4603
++	case api.Resource("nodes"):
4604
++		err = validateNodes(a)
4605
++	case rbac.Resource("clusterroles"):
4606
++		err = validateClusterRoles(a)
4607
++	case rbac.Resource("clusterrolebindings"):
4608
++		err = validateClusterRoleBindings(a)
4609
++	case api.Resource("persistentvolumes"):
4610
++		err = validatePersistentVolumes(vac, a)
4611
++	}
4612
++
4613
++	return err
4614
++}
4615
++
4616
++// Handles returns true if this admission controller can handle the given operation
4617
++// where operation can be one of CREATE, UPDATE, DELETE, or CONNECT.
4618
++func (vac *vmwareAdmissionController) Handles(operation admission.Operation) bool {
4619
++	return true
4620
++}
4621
++
4622
++// NewVMwareAdmissionController creates a new VMwareAdmissionController.
4623
++func NewVMwareAdmissionController(configFile io.Reader) (*vmwareAdmissionController, error) {
4624
++	glog.V(2).Infof("%s is enabled", PluginName)
4625
++	if configFile == nil {
4626
++		glog.Warningf("No config specified for %s. Using default configuration", PluginName)
4627
++		return nil, fmt.Errorf("no config file specified for %s", PluginName)
4628
++	}
4629
++
4630
++	var config AdmissionConfig
4631
++	d := yaml.NewYAMLOrJSONDecoder(configFile, 4096)
4632
++	err := d.Decode(&config)
4633
++	if err != nil {
4634
++		return nil, err
4635
++	}
4636
++
4637
++	// Load PSP from file. If it fails, use default.
4638
++	privilegedMode := true
4639
++	psp := getPSPFromFile(config.VMwareAdmissionController.PodSecurityPolicyFile)
4640
++	if psp == nil {
4641
++		psp = getDefaultPSP()
4642
++		privilegedMode = false
4643
++	}
4644
++
4645
++	return &vmwareAdmissionController{
4646
++		psp:             psp,
4647
++		strategyFactory: podsecuritypolicy.NewSimpleStrategyFactory(),
4648
++		privilegedGroup: config.VMwareAdmissionController.PrivilegedGroup,
4649
++		clusterID:       config.VMwareAdmissionController.ClusterID,
4650
++		privilegedMode:  privilegedMode,
4651
++	}, nil
4652
++}
4653
++
4654
++func getDefaultPSP() *policy.PodSecurityPolicy {
4655
++	return &policy.PodSecurityPolicy{
4656
++		TypeMeta: metav1.TypeMeta{
4657
++			Kind:       "PodSecurityPolicy",
4658
++			APIVersion: "policy/v1beta1",
4659
++		},
4660
++		Spec: policy.PodSecurityPolicySpec{
4661
++			Privileged:               false,
4662
++			HostNetwork:              false,
4663
++			HostIPC:                  false,
4664
++			HostPID:                  false,
4665
++			AllowPrivilegeEscalation: false,
4666
++			HostPorts: []policy.HostPortRange{
4667
++				{1, 65535},
4668
++			},
4669
++			Volumes: []policy.FSType{
4670
++				"emptyDir",
4671
++				"secret",
4672
++				"downwardAPI",
4673
++				"configMap",
4674
++				"persistentVolumeClaim",
4675
++				"projected",
4676
++				"hostPath",
4677
++			},
4678
++			// We allow /etc/ssl/certs to be mounted in read only mode as a hack to allow Wavefront pods to be deployed.
4679
++			// TODO(ashokc): Once we have support for users to create pods using privileged mode and host path, remove this.
4680
++			AllowedHostPaths: []policy.AllowedHostPath{
4681
++				{
4682
++					PathPrefix: etcSslCerts,
4683
++					ReadOnly:   true,
4684
++				},
4685
++			},
4686
++			FSGroup: policy.FSGroupStrategyOptions{
4687
++				Rule: policy.FSGroupStrategyRunAsAny,
4688
++			},
4689
++			RunAsUser: policy.RunAsUserStrategyOptions{
4690
++				Rule: policy.RunAsUserStrategyRunAsAny,
4691
++			},
4692
++			SELinux: policy.SELinuxStrategyOptions{
4693
++				Rule: policy.SELinuxStrategyRunAsAny,
4694
++			},
4695
++			SupplementalGroups: policy.SupplementalGroupsStrategyOptions{
4696
++				Rule: policy.SupplementalGroupsStrategyRunAsAny,
4697
++			},
4698
++		},
4699
++	}
4700
++}
4701
++
4702
++func getPSPFromFile(pspFile string) *policy.PodSecurityPolicy {
4703
++	pspBeta := v1beta1.PodSecurityPolicy{}
4704
++	pspExtensions := policy.PodSecurityPolicy{}
4705
++
4706
++	if pspFile == "" {
4707
++		glog.V(2).Infof("%s: PSP file not specified, using default PSP", PluginName)
4708
++		return nil
4709
++	}
4710
++
4711
++	pspConfig, err := os.Open(pspFile)
4712
++	if err != nil {
4713
++		glog.V(2).Infof("%s: cannot open PSP file, using default PSP: %v", PluginName, err)
4714
++		return nil
4715
++	}
4716
++
4717
++	// We load the PSP that we read from file into pspBeta because this is the struct to which we can decode yaml to.
4718
++	d := yaml.NewYAMLOrJSONDecoder(pspConfig, 4096)
4719
++	err = d.Decode(&pspBeta)
4720
++	if err != nil {
4721
++		glog.V(2).Infof("%s: cannot decode PSP file, using default PSP: %v", PluginName, err)
4722
++		return nil
4723
++	}
4724
++
4725
++	// We convert pspBeta object into pspExtensions object because this is the one that pod validation uses.
4726
++	err = policybeta.Convert_v1beta1_PodSecurityPolicy_To_policy_PodSecurityPolicy(&pspBeta, &pspExtensions, nil)
4727
++	if err != nil {
4728
++		glog.V(2).Infof("%s: cannot convert v1beta1.PSP to extensions.PSP, using default PSP: %v", PluginName, err)
4729
++		return nil
4730
++	}
4731
++
4732
++	return &pspExtensions
4733
++}
4734
++
4735
++func isPrivilegedUser(vac *vmwareAdmissionController, a admission.Attributes) bool {
4736
++	// If the request comes from a user belonging to a privileged group, then we allow it. Only calls from Cascade
4737
++	// controller will belong to this privileged group.
4738
++	groups := a.GetUserInfo().GetGroups()
4739
++	for _, group := range groups {
4740
++		if group == vac.privilegedGroup {
4741
++			return true
4742
++		}
4743
++	}
4744
++
4745
++	return false
4746
++}
4747
++
4748
++func isCertificateFromMaster(a admission.Attributes) bool {
4749
++	groups := a.GetUserInfo().GetGroups()
4750
++	for _, group := range groups {
4751
++		if group == systemMastersGroup {
4752
++			return true
4753
++		}
4754
++	}
4755
++	return false
4756
++}
4757
++
4758
++func validateCertificateFromMaster(vac *vmwareAdmissionController, a admission.Attributes) (err error) {
4759
++	// kube-controller-manager, kube-scheduler and cloud-init script which creates our pods and other resources can use
4760
++	// the master certificate to create pods in privileged namespace. If the request comes to any other namespace,
4761
++	// we need to make it go through our pod validation. This is needed because a user can create a deployment or
4762
++	// replica set which has a privileged pod. Since our admission controller does not look at deployments or replica
4763
++	// sets, we will allow it. The actual pod inside the deployment or replica set will be created by the
4764
++	// controller-manager and if we allow it to create pods in any namespace, then a user can create a privileged pod
4765
++	// totally bypassing our security checks.
4766
++	if !isPrivilegedNamespace(a) && (a.GetResource().GroupResource() == api.Resource("pods")) {
4767
++		return validatePods(vac, a)
4768
++	}
4769
++
4770
++	// For all other resources, allow.
4771
++	return nil
4772
++}
4773
++
4774
++func isCertificateFromWorker(a admission.Attributes) bool {
4775
++	groups := a.GetUserInfo().GetGroups()
4776
++	for _, group := range groups {
4777
++		if group == systemWorkerGroup {
4778
++			return true
4779
++		}
4780
++	}
4781
++	return false
4782
++}
4783
++
4784
++func isCreatingPodsThroughControllerManager(resource string) bool {
4785
++	// If the resource is one of the following, it means the controller manager will create a pod for them and not the
4786
++	// user directly. So, we need to identify these cases and block them in certain scenarios.
4787
++	if resource == "deployments" ||
4788
++		resource == "replicasets" ||
4789
++		resource == "replicationcontrollers" ||
4790
++		resource == "statefulsets" ||
4791
++		resource == "daemonsets" ||
4792
++		resource == "jobs" ||
4793
++		resource == "cronjobs" {
4794
++		return true
4795
++	}
4796
++	return false
4797
++}
4798
++
4799
++func validateCertificateFromWorker(a admission.Attributes) error {
4800
++	// Block exec operations into pods for workers. This is needed to block someone from using Kubelet's certificate to
4801
++	// exec into privileged pods running on the master. Other operations with the node certificate like modifying master
4802
++	// node, creating pods on master node, etc. are blocked by the node restriction admission controller.
4803
++	resource := a.GetResource().GroupResource()
4804
++	if resource == api.Resource("pods") && a.GetOperation() == admission.Connect {
4805
++		return admission.NewForbidden(a,
4806
++			fmt.Errorf("%s validation failed: cannot modify pods in namespace %s", PluginName, a.GetNamespace()))
4807
++	}
4808
++
4809
++	// Block creation of pods indirectly by going through the controller manager.
4810
++	if isCreatingPodsThroughControllerManager(resource.Resource) {
4811
++		return admission.NewForbidden(a,
4812
++			fmt.Errorf("%s validation failed: cannot modify %s in namespace %s", PluginName, resource.Resource, a.GetNamespace()))
4813
++	}
4814
++
4815
++	return nil
4816
++}
4817
++
4818
++func isPrivilegedNamespace(a admission.Attributes) bool {
4819
++	// If the namespace mentioned in the resource is privileged, return true. We will hit this for calls made to all
4820
++	// resources in this namespace and during delete and update operation on the namespace itself.
4821
++	if a.GetNamespace() == privilegedNamespace {
4822
++		return true
4823
++	}
4824
++
4825
++	// If the resource is a namespace and if its name matched the privileged namespace, return true. We will hit this
4826
++	// during creation of the namespace.
4827
++	if a.GetResource().GroupResource() == api.Resource("namespaces") {
4828
++		if namespace, ok := a.GetObject().(*api.Namespace); ok {
4829
++			if namespace.Name == privilegedNamespace {
4830
++				return true
4831
++			}
4832
++		}
4833
++	}
4834
++
4835
++	return false
4836
++}
4837
++
4838
++func isPrivilegedServiceAccount(a admission.Attributes) bool {
4839
++	user := a.GetUserInfo().GetName()
4840
++	return strings.HasPrefix(user, privilegedServiceAccount)
4841
++}
4842
++
4843
++func validatePrivilegedServiceAccount(a admission.Attributes) error {
4844
++	// If the privileged service account performs any operation on the pods resource like create, update or connect,
4845
++	// we block it. This is needed so that we can block exec access into privileged pods running on the master. Also,
4846
++	// privileged service account does not need to perform these operations. So, just to be extra cautious we also block
4847
++	// off create and update pods.
4848
++	resource := a.GetResource().GroupResource()
4849
++	if resource == api.Resource("pods") {
4850
++		// Allow Delete operation on pods
4851
++		if a.GetOperation() == admission.Delete {
4852
++			return nil
4853
++		}
4854
++		// Allow subresources other than exec on pods
4855
++		if len(a.GetSubresource()) != 0 && a.GetSubresource() != "exec" {
4856
++			return nil
4857
++		}
4858
++		// Block all other operations
4859
++		if a.GetOperation() == admission.Create || a.GetOperation() == admission.Update || a.GetOperation() == admission.Connect {
4860
++			return admission.NewForbidden(a,
4861
++				fmt.Errorf("%s validation failed: cannot modify pods in namespace %s", PluginName, a.GetNamespace()))
4862
++		}
4863
++	}
4864
++
4865
++	// If the privileged service account tries to update taints on the master node, we block. We need to do this so that
4866
++	// a user cannot use a privileged service account to untaint the node and run pods on a master.
4867
++	if resource == api.Resource("nodes") {
4868
++		if a.GetOperation() == admission.Update && strings.HasPrefix(a.GetName(), masterNodePrefix) {
4869
++			node, ok := a.GetObject().(*api.Node)
4870
++			if !ok {
4871
++				return admission.NewForbidden(a,
4872
++					fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4873
++			}
4874
++			oldNode, ok := a.GetOldObject().(*api.Node)
4875
++			if !ok {
4876
++				return admission.NewForbidden(a,
4877
++					fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetOldObject()))
4878
++			}
4879
++
4880
++			if !apiequality.Semantic.DeepEqual(node.Spec.Taints, oldNode.Spec.Taints) {
4881
++				return admission.NewForbidden(a,
4882
++					fmt.Errorf("%s validation failed: cannot modify taints on a node", PluginName))
4883
++			}
4884
++		}
4885
++	}
4886
++
4887
++	// Block creation of pods indirectly by going through the controller manager.
4888
++	if isCreatingPodsThroughControllerManager(resource.Resource) {
4889
++		return admission.NewForbidden(a,
4890
++			fmt.Errorf("%s validation failed: cannot modify %s in namespace %s", PluginName, resource.Resource, a.GetNamespace()))
4891
++	}
4892
++
4893
++	return nil
4894
++}
4895
++
4896
++func validateNodes(a admission.Attributes) error {
4897
++	// If it is a connect operation on the sub resource, allow it. Sub resources of nodes are nodes/nodename/proxy and
4898
++	// nodes/nodename/status. Prometheus needs read access to nodes/nodename/proxy/metrics. To support that and other
4899
++	// pods which might need read access to node metrics, we need to allow this. But the VKE authorizer blocks off any
4900
++	// access to perform exec, attach or run on the proxy resource on a master which will prevent the users from getting
4901
++	// access to the privileged pods on master.
4902
++	if a.GetOperation() == admission.Connect && len(a.GetSubresource()) != 0 {
4903
++		return nil
4904
++	}
4905
++
4906
++	// If the operation is Delete, fail. Deleting a node is not something that is useful to the user. Also, by deleting
4907
++	// a node, they can potentially make their cluster useless.
4908
++	if a.GetOperation() == admission.Delete {
4909
++		return admission.NewForbidden(a, fmt.Errorf("%s validation failed: cannot delete nodes", PluginName))
4910
++	}
4911
++
4912
++	// If the operation is on a master node, fail. We do not want to allow the users to modify labels and taints on the
4913
++	// master node because it can compromise the security of the cluster.
4914
++	if strings.HasPrefix(a.GetName(), masterNodePrefix) {
4915
++		return admission.NewForbidden(a, fmt.Errorf("%s validation failed: cannot modify master nodes", PluginName))
4916
++	}
4917
++
4918
++	return nil
4919
++}
4920
++
4921
++func validateClusterRoles(a admission.Attributes) error {
4922
++	// If the name in the request is not empty and has the reserved prefix, then fail. We will hit this during delete
4923
++	// and update operations on the cluster roles. If it does not have the reserved prefix, allow it. If the name is
4924
++	// empty then proceed to read it from the object in the request.
4925
++	if a.GetName() != "" {
4926
++		return checkReservedPrefix(a.GetName(), a)
4927
++	}
4928
++
4929
++	clusterRole, ok := a.GetObject().(*rbac.ClusterRole)
4930
++	// If we cannot get the cluster role binding object, fail.
4931
++	if !ok {
4932
++		return admission.NewForbidden(a,
4933
++			fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4934
++	}
4935
++	// If we get the object and the name has the reserved prefix, fail. We will hit this when someone tries to create a
4936
++	// cluster role with the reserved prefix.
4937
++	return checkReservedPrefix(clusterRole.Name, a)
4938
++}
4939
++
4940
++func validateClusterRoleBindings(a admission.Attributes) error {
4941
++	// If the name in the request is not empty and has the reserved prefix, then fail. We will hit this during delete
4942
++	// and update operations on the cluster role bindings. If it does not have the reserved prefix, allow it. If the
4943
++	// name is empty then proceed to read it from the object in the request.
4944
++	if a.GetName() != "" {
4945
++		return checkReservedPrefix(a.GetName(), a)
4946
++	}
4947
++
4948
++	clusterRoleBinding, ok := a.GetObject().(*rbac.ClusterRoleBinding)
4949
++	// If we cannot get the cluster role binding object, fail.
4950
++	if !ok {
4951
++		return admission.NewForbidden(a,
4952
++			fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4953
++	}
4954
++	// If we get the object and the name has the reserved prefix, fail. We will hit this when someone tries to create a
4955
++	// cluster role binding with the reserved prefix.
4956
++	return checkReservedPrefix(clusterRoleBinding.Name, a)
4957
++}
4958
++
4959
++func validatePersistentVolumes(vac *vmwareAdmissionController, a admission.Attributes) error {
4960
++	// If the operation is not a Create operation, we allow. This is because Create is the only operation which can be
4961
++	// used to create a new PV of type hostPath to get access to the host file system. All the other operations
4962
++	// including Update cannot be used to gain access to host file system.
4963
++	if a.GetOperation() != admission.Create {
4964
++		return nil
4965
++	}
4966
++
4967
++	pv, ok := a.GetObject().(*api.PersistentVolume)
4968
++	// If we cannot get the PV object, fail.
4969
++	if !ok {
4970
++		return admission.NewForbidden(a,
4971
++			fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
4972
++	}
4973
++
4974
++	// If we are running in non-privileged mode, then fail if the PV is of type hostPath. We want to do this to prevent
4975
++	// access to host file system on a non-privileged cluster.
4976
++	if !vac.privilegedMode {
4977
++		if pv.Spec.HostPath != nil {
4978
++			return admission.NewForbidden(a,
4979
++				fmt.Errorf("%s validation failed: cannot create a PersistentVolume of type hostPath", PluginName))
4980
++		}
4981
++	}
4982
++
4983
++	return nil
4984
++}
4985
++
4986
++func validatePods(vac *vmwareAdmissionController, a admission.Attributes) error {
4987
++	// If the request is acting on a sub resource of a pod then allow it. This request is not directly coming to a pod,
4988
++	// but to a sub-resource like pods/foo/status. So, this does not have to be blocked.
4989
++	if len(a.GetSubresource()) != 0 {
4990
++		return nil
4991
++	}
4992
++
4993
++	// If it is a Connect or Delete operation, allow it. We restrict access to connect to any pods in the vke-system
4994
++	// namespace. So it is OK to allow this.
4995
++	if a.GetOperation() == admission.Connect || a.GetOperation() == admission.Delete {
4996
++		return nil
4997
++	}
4998
++
4999
++	// If we cannot get the pod object, fail.
5000
++	if _, ok := a.GetObject().(*api.Pod); !ok {
5001
++		return admission.NewForbidden(a,
5002
++			fmt.Errorf("%s validation failed: unexpected type %T", PluginName, a.GetObject()))
5003
++	}
5004
++
5005
++	// If this is an update, see if we are only updating the ownerRef/finalizers.  Garbage collection does this
5006
++	// and we should allow it in general, since you had the power to update and the power to delete.
5007
++	// The worst that happens is that you delete something, but you aren't controlling the privileged object itself
5008
++	if a.GetOperation() == admission.Update &&
5009
++		rbacregistry.IsOnlyMutatingGCFields(a.GetObject(), a.GetOldObject(), apiequality.Semantic) {
5010
++		return nil
5011
++	}
5012
++
5013
++	errs := field.ErrorList{}
5014
++	originalPod := a.GetObject().(*api.Pod)
5015
++
5016
++	// Generate a copy of the pod object because we are not allowed to mutate the pod object.
5017
++	pod := originalPod.DeepCopy()
5018
++
5019
++	provider, err := podsecuritypolicy.NewSimpleProvider(vac.psp, pod.Namespace, vac.strategyFactory)
5020
++	if err != nil {
5021
++		return admission.NewForbidden(a, fmt.Errorf("%s validation failed: %v", PluginName, err))
5022
++	}
5023
++
5024
++	// Set default security context for the pod. This fills in the defaults for the security context values that are not
5025
++	// provided. This is needed to validate the security context correctly.
5026
++	err = provider.DefaultPodSecurityContext(pod)
5027
++	if err != nil {
5028
++		errs = append(errs, field.Invalid(field.NewPath("spec", "securityContext"),
5029
++			pod.Spec.SecurityContext, err.Error()))
5030
++	}
5031
++
5032
++	// Validate the pod.
5033
++	errs = append(errs, provider.ValidatePod(pod)...)
5034
++
5035
++	// Validate the pod's tolerations.
5036
++	fieldErr := validatePodToleration(pod)
5037
++	if fieldErr != nil {
5038
++		errs = append(errs, fieldErr)
5039
++	}
5040
++
5041
++	// Validate the initContainers that are part of the pod.
5042
++	for i := range pod.Spec.InitContainers {
5043
++		err := provider.DefaultContainerSecurityContext(pod, &pod.Spec.InitContainers[i])
5044
++		if err != nil {
5045
++			errs = append(errs, field.Invalid(field.NewPath("spec", "initContainers").Index(i).
5046
++				Child("securityContext"), "", err.Error()))
5047
++			continue
5048
++		}
5049
++		errs = append(errs, provider.ValidateContainer(pod, &pod.Spec.InitContainers[i],
5050
++			field.NewPath("spec", "initContainers").Index(i))...)
5051
++	}
5052
++
5053
++	// Validate the containers that are part of the pod.
5054
++	for i := range pod.Spec.Containers {
5055
++		err := provider.DefaultContainerSecurityContext(pod, &pod.Spec.Containers[i])
5056
++		if err != nil {
5057
++			errs = append(errs, field.Invalid(field.NewPath("spec", "containers").Index(i).
5058
++				Child("securityContext"), "", err.Error()))
5059
++			continue
5060
++		}
5061
++		errs = append(errs, provider.ValidateContainer(pod, &pod.Spec.Containers[i],
5062
++			field.NewPath("spec", "containers").Index(i))...)
5063
++	}
5064
++
5065
++	// Validate that /etc/ssl/certs if mounted using hostPath volume mount is readOnly.
5066
++	fieldErr = validateEtcSslCertsHostPath(pod)
5067
++	if fieldErr != nil {
5068
++		errs = append(errs, fieldErr)
5069
++	}
5070
++
5071
++	if len(errs) > 0 {
5072
++		return admission.NewForbidden(a,
5073
++			fmt.Errorf("%s validation failed: %v", PluginName, errs))
5074
++	}
5075
++
5076
++	return nil
5077
++}
5078
++
5079
++func validatePodToleration(pod *api.Pod) *field.Error {
5080
++	// Master nodes are tainted with "Dedicated=Master:NoSchedule". Only vke-system pods are allowed to tolerate
5081
++	// this taint and to run on master nodes. A user's pod will be rejected if its spec has toleration for this taint.
5082
++	for _, t := range pod.Spec.Tolerations {
5083
++		reject := false
5084
++
5085
++		if t.Key == reservedTolerationKey && t.Value == reservedTolerationValue {
5086
++			// Reject pod that has the reserved toleration "Dedicated=Master"
5087
++			reject = true
5088
++		} else if t.Operator == api.TolerationOpExists && (t.Key == reservedTolerationKey || t.Key == "") {
5089
++			// Reject pod that has wildcard toleration matching the reserved toleration
5090
++			reject = true
5091
++		}
5092
++
5093
++		if reject {
5094
++			return field.Invalid(field.NewPath("spec", "toleration"), fmt.Sprintf("%+v", t),
5095
++				fmt.Sprintf("%s validation failed: should not tolerate master node taint", PluginName))
5096
++		}
5097
++	}
5098
++	return nil
5099
++}
5100
++
5101
++// Validate that /etc/ssl/certs if mounted using hostPath volume mount is readOnly. If not, fail.
5102
++// This is a hack that is needed to get Wavefront pods to work.
5103
++// TODO(ashokc): Once we have support for users to create pods using privileged mode and host path, remove this.
5104
++func validateEtcSslCertsHostPath(pod *api.Pod) *field.Error {
5105
++	// Get volumes which mount /etc/ssl/certs and put them in a map.
5106
++	volumes := map[string]struct{}{}
5107
++	for _, vol := range pod.Spec.Volumes {
5108
++		if vol.HostPath != nil && strings.HasPrefix(vol.HostPath.Path, etcSslCerts) {
5109
++			volumes[vol.Name] = struct{}{}
5110
++		}
5111
++	}
5112
++
5113
++	// For every initContainer, get all volumeMounts and verify if it matches any of the volumes in the volumes map.
5114
++	// If yes, then check if they are read only. If not, return an error.
5115
++	err := checkVolumeReadOnly(pod.Spec.InitContainers, volumes, "initContainers")
5116
++	if err != nil {
5117
++		return err
5118
++	}
5119
++
5120
++	// For every container, get all volumeMounts and verify if it matches any of the volumes in the volumes map.
5121
++	// If yes, then check if they are read only. If not, return an error.
5122
++	err = checkVolumeReadOnly(pod.Spec.Containers, volumes, "containers")
5123
++	if err != nil {
5124
++		return err
5125
++	}
5126
++
5127
++	return nil
5128
++}
5129
++
5130
++// Checks if the container has a volumeMount belonging to the volumes map. If yes, it has to be read only. If not,
5131
++// return error.
5132
++func checkVolumeReadOnly(containers []api.Container, volumes map[string]struct{}, containerType string) *field.Error {
5133
++	for i, container := range containers {
5134
++		for _, vol := range container.VolumeMounts {
5135
++			if _, ok := volumes[vol.Name]; ok {
5136
++				if !vol.ReadOnly {
5137
++					return field.Invalid(field.NewPath("spec", containerType).Index(i).Child("volumeMounts"),
5138
++						fmt.Sprintf("%+v", vol), fmt.Sprintf("%s has to be mount as readOnly", etcSslCerts))
5139
++				}
5140
++			}
5141
++		}
5142
++	}
5143
++	return nil
5144
++}
5145
++
5146
++func checkReservedPrefix(resourceName string, a admission.Attributes) error {
5147
++	if strings.HasPrefix(resourceName, reservedPrefix) {
5148
++		return admission.NewForbidden(a,
5149
++			fmt.Errorf("%s validation failed: cannot modify resources with prefix %s", PluginName, reservedPrefix))
5150
++	}
5151
++	return nil
5152
++}
5153
+diff --git a/plugin/pkg/admission/vke/admission_test.go b/plugin/pkg/admission/vke/admission_test.go
5154
+new file mode 100644
5155
+index 0000000..1842253
5156
+--- /dev/null
5157
+@@ -0,0 +1,995 @@
5158
++package vke
5159
++
5160
++import (
5161
++	"fmt"
5162
++	"os"
5163
++	"strings"
5164
++	"testing"
5165
++
5166
++	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
5167
++	"k8s.io/apimachinery/pkg/runtime"
5168
++	kadmission "k8s.io/apiserver/pkg/admission"
5169
++	kapi "k8s.io/kubernetes/pkg/apis/core"
5170
++	"k8s.io/kubernetes/pkg/apis/rbac"
5171
++	"k8s.io/kubernetes/staging/src/k8s.io/apiserver/pkg/authentication/user"
5172
++)
5173
++
5174
++const (
5175
++	testServiceAccountsGroup = "system.test\\cascade-controller-service-accounts"
5176
++	clusterID                = "cluster-id"
5177
++	defaultConfigFileFormat  = `
5178
++vmwareAdmissionController:
5179
++  privilegedGroup: %s
5180
++  podSecurityPolicyFile: %s
5181
++  clusterID: %s
5182
++`
5183
++	pspFileName   = "/tmp/psp.yaml"
5184
++	pspConfigFile = `
5185
++apiVersion: extensions/v1beta1
5186
++kind: PodSecurityPolicy
5187
++metadata:
5188
++  name: vmware-pod-security-policy-restricted
5189
++spec:
5190
++  privileged: true
5191
++  fsGroup:
5192
++    rule: RunAsAny
5193
++  runAsUser:
5194
++    rule: RunAsAny
5195
++  seLinux:
5196
++    rule: RunAsAny
5197
++  supplementalGroups:
5198
++    rule: RunAsAny
5199
++  volumes:
5200
++  - 'emptyDir'
5201
++  - 'secret'
5202
++  - 'downwardAPI'
5203
++  - 'configMap'
5204
++  - 'persistentVolumeClaim'
5205
++  - 'projected'
5206
++  - 'hostPath'
5207
++  hostPID: false
5208
++  hostIPC: false
5209
++  hostNetwork: true
5210
++  hostPorts:
5211
++  - min: 1
5212
++    max: 65536
5213
++`
5214
++)
5215
++
5216
++func TestAdmitPrivileged(t *testing.T) {
5217
++	tests := map[string]struct {
5218
++		operation          kadmission.Operation
5219
++		pod                *kapi.Pod
5220
++		name               string
5221
++		userInfo           user.Info
5222
++		shouldPassValidate bool
5223
++	}{
5224
++		"create pod with Privileged=nil allowed": {
5225
++			operation:          kadmission.Create,
5226
++			pod:                newTestPodBuilder().build(),
5227
++			userInfo:           newTestUserBuilder().build(),
5228
++			shouldPassValidate: true,
5229
++		},
5230
++		"create pod with Privileged=false allowed": {
5231
++			operation:          kadmission.Create,
5232
++			pod:                newTestPodBuilder().withPrivileged(false).build(),
5233
++			userInfo:           newTestUserBuilder().build(),
5234
++			shouldPassValidate: true,
5235
++		},
5236
++		"create pod with Privileged=true denied": {
5237
++			operation:          kadmission.Create,
5238
++			pod:                newTestPodBuilder().withPrivileged(true).build(),
5239
++			userInfo:           newTestUserBuilder().build(),
5240
++			shouldPassValidate: false,
5241
++		},
5242
++		"create pod with multiple containers, one has Privileged=true denied": {
5243
++			operation:          kadmission.Create,
5244
++			pod:                newTestPodBuilder().withPrivileged(true).withInitContainer().withContainer().build(),
5245
++			userInfo:           newTestUserBuilder().build(),
5246
++			shouldPassValidate: false,
5247
++		},
5248
++		"update pod with Privileged=true denied": {
5249
++			operation:          kadmission.Update,
5250
++			pod:                newTestPodBuilder().withPrivileged(true).build(),
5251
++			userInfo:           newTestUserBuilder().build(),
5252
++			shouldPassValidate: false,
5253
++		},
5254
++		"create pod with HostNetwork=true denied": {
5255
++			operation:          kadmission.Create,
5256
++			pod:                newTestPodBuilder().withHostNetwork(true).build(),
5257
++			userInfo:           newTestUserBuilder().build(),
5258
++			shouldPassValidate: false,
5259
++		},
5260
++		"create pod with HostIPC=true denied": {
5261
++			operation:          kadmission.Create,
5262
++			pod:                newTestPodBuilder().withHostIPC(true).build(),
5263
++			userInfo:           newTestUserBuilder().build(),
5264
++			shouldPassValidate: false,
5265
++		},
5266
++		"create pod with HostPID=true denied": {
5267
++			operation:          kadmission.Create,
5268
++			pod:                newTestPodBuilder().withHostPID(true).build(),
5269
++			userInfo:           newTestUserBuilder().build(),
5270
++			shouldPassValidate: false,
5271
++		},
5272
++		"create pod with HostPort allowed": {
5273
++			operation:          kadmission.Create,
5274
++			pod:                newTestPodBuilder().withHostPort().build(),
5275
++			userInfo:           newTestUserBuilder().build(),
5276
++			shouldPassValidate: true,
5277
++		},
5278
++		"create pod with HostVolume denied": {
5279
++			operation:          kadmission.Create,
5280
++			pod:                newTestPodBuilder().withHostVolume("/", false).build(),
5281
++			userInfo:           newTestUserBuilder().build(),
5282
++			shouldPassValidate: false,
5283
++		},
5284
++		"create pod with HostVolume /etc/ssl/certs in read-only mode allowed": {
5285
++			operation:          kadmission.Create,
5286
++			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", true).build(),
5287
++			userInfo:           newTestUserBuilder().build(),
5288
++			shouldPassValidate: true,
5289
++		},
5290
++		"create pod with HostVolume /etc/ssl/certs in read-write mode denied": {
5291
++			operation:          kadmission.Create,
5292
++			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", false).build(),
5293
++			userInfo:           newTestUserBuilder().build(),
5294
++			shouldPassValidate: false,
5295
++		},
5296
++		"create pod with CascadeDisk allowed": {
5297
++			operation:          kadmission.Create,
5298
++			pod:                newTestPodBuilder().withCascadeDisk().build(),
5299
++			userInfo:           newTestUserBuilder().build(),
5300
++			shouldPassValidate: true,
5301
++		},
5302
++		"create pod with HostVolume and CascadeDisk denied": {
5303
++			operation:          kadmission.Create,
5304
++			pod:                newTestPodBuilder().withHostVolume("/", false).withCascadeDisk().build(),
5305
++			userInfo:           newTestUserBuilder().build(),
5306
++			shouldPassValidate: false,
5307
++		},
5308
++		"connect pod allowed": {
5309
++			operation:          kadmission.Connect,
5310
++			pod:                newTestPodBuilder().build(),
5311
++			userInfo:           newTestUserBuilder().build(),
5312
++			shouldPassValidate: true,
5313
++		},
5314
++		"delete pod allowed": {
5315
++			operation:          kadmission.Delete,
5316
++			pod:                nil,
5317
++			userInfo:           newTestUserBuilder().build(),
5318
++			shouldPassValidate: true,
5319
++		},
5320
++	}
5321
++
5322
++	for k, v := range tests {
5323
++		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
5324
++	}
5325
++}
5326
++
5327
++func TestAdmitPrivilegedWithCustomPSP(t *testing.T) {
5328
++	tests := map[string]struct {
5329
++		operation          kadmission.Operation
5330
++		pod                *kapi.Pod
5331
++		name               string
5332
++		userInfo           user.Info
5333
++		shouldPassValidate bool
5334
++	}{
5335
++		"create pod with Privileged=nil allowed": {
5336
++			operation:          kadmission.Create,
5337
++			pod:                newTestPodBuilder().build(),
5338
++			userInfo:           newTestUserBuilder().build(),
5339
++			shouldPassValidate: true,
5340
++		},
5341
++		"create pod with Privileged=false allowed": {
5342
++			operation:          kadmission.Create,
5343
++			pod:                newTestPodBuilder().withPrivileged(false).build(),
5344
++			userInfo:           newTestUserBuilder().build(),
5345
++			shouldPassValidate: true,
5346
++		},
5347
++		"create pod with Privileged=true allowed": {
5348
++			operation:          kadmission.Create,
5349
++			pod:                newTestPodBuilder().withPrivileged(true).build(),
5350
++			userInfo:           newTestUserBuilder().build(),
5351
++			shouldPassValidate: true,
5352
++		},
5353
++		"create pod with multiple containers, one has Privileged=true allowed": {
5354
++			operation:          kadmission.Create,
5355
++			pod:                newTestPodBuilder().withPrivileged(true).withInitContainer().withContainer().build(),
5356
++			userInfo:           newTestUserBuilder().build(),
5357
++			shouldPassValidate: true,
5358
++		},
5359
++		"update pod with Privileged=true allowed": {
5360
++			operation:          kadmission.Update,
5361
++			pod:                newTestPodBuilder().withPrivileged(true).build(),
5362
++			userInfo:           newTestUserBuilder().build(),
5363
++			shouldPassValidate: true,
5364
++		},
5365
++		"create pod with HostNetwork=true allowed": {
5366
++			operation:          kadmission.Create,
5367
++			pod:                newTestPodBuilder().withHostNetwork(true).build(),
5368
++			userInfo:           newTestUserBuilder().build(),
5369
++			shouldPassValidate: true,
5370
++		},
5371
++		"create pod with HostIPC=true denied": {
5372
++			operation:          kadmission.Create,
5373
++			pod:                newTestPodBuilder().withHostIPC(true).build(),
5374
++			userInfo:           newTestUserBuilder().build(),
5375
++			shouldPassValidate: false,
5376
++		},
5377
++		"create pod with HostPID=true denied": {
5378
++			operation:          kadmission.Create,
5379
++			pod:                newTestPodBuilder().withHostPID(true).build(),
5380
++			userInfo:           newTestUserBuilder().build(),
5381
++			shouldPassValidate: false,
5382
++		},
5383
++		"create pod with HostPort allowed": {
5384
++			operation:          kadmission.Create,
5385
++			pod:                newTestPodBuilder().withHostPort().build(),
5386
++			userInfo:           newTestUserBuilder().build(),
5387
++			shouldPassValidate: true,
5388
++		},
5389
++		"create pod with HostVolume allowed": {
5390
++			operation:          kadmission.Create,
5391
++			pod:                newTestPodBuilder().withHostVolume("/", false).build(),
5392
++			userInfo:           newTestUserBuilder().build(),
5393
++			shouldPassValidate: true,
5394
++		},
5395
++		"create pod with HostVolume /etc/ssl/certs in read-only mode allowed": {
5396
++			operation:          kadmission.Create,
5397
++			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", true).build(),
5398
++			userInfo:           newTestUserBuilder().build(),
5399
++			shouldPassValidate: true,
5400
++		},
5401
++		"create pod with HostVolume /etc/ssl/certs in read-write mode denied": {
5402
++			operation:          kadmission.Create,
5403
++			pod:                newTestPodBuilder().withHostVolume("/etc/ssl/certs", false).build(),
5404
++			userInfo:           newTestUserBuilder().build(),
5405
++			shouldPassValidate: false,
5406
++		},
5407
++		"create pod with CascadeDisk allowed": {
5408
++			operation:          kadmission.Create,
5409
++			pod:                newTestPodBuilder().withCascadeDisk().build(),
5410
++			userInfo:           newTestUserBuilder().build(),
5411
++			shouldPassValidate: true,
5412
++		},
5413
++		"create pod with HostVolume and CascadeDisk allowed": {
5414
++			operation:          kadmission.Create,
5415
++			pod:                newTestPodBuilder().withHostVolume("/", false).withCascadeDisk().build(),
5416
++			userInfo:           newTestUserBuilder().build(),
5417
++			shouldPassValidate: true,
5418
++		},
5419
++		"connect pod allowed": {
5420
++			operation:          kadmission.Connect,
5421
++			pod:                newTestPodBuilder().build(),
5422
++			userInfo:           newTestUserBuilder().build(),
5423
++			shouldPassValidate: true,
5424
++		},
5425
++		"delete pod allowed": {
5426
++			operation:          kadmission.Delete,
5427
++			pod:                nil,
5428
++			userInfo:           newTestUserBuilder().build(),
5429
++			shouldPassValidate: true,
5430
++		},
5431
++	}
5432
++
5433
++	// Setup custom PSP file.
5434
++	file, err := os.Create(pspFileName)
5435
++	if err != nil {
5436
++		t.Errorf("TestAdmitPrivilegedWithCustomPSP: failed to open custom PSP file %v", err)
5437
++		return
5438
++	}
5439
++	_, err = file.WriteString(pspConfigFile)
5440
++	if err != nil {
5441
++		t.Errorf("TestAdmitPrivilegedWithCustomPSP: failed to write to custom PSP file %v", err)
5442
++		return
5443
++	}
5444
++
5445
++	for k, v := range tests {
5446
++		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
5447
++	}
5448
++
5449
++	// Delete custom PSP file.
5450
++	err = os.Remove(pspFileName)
5451
++	if err != nil {
5452
++		t.Errorf("TestAdmitPrivilegedWithCustomPSP: failed to delete custom PSP file %v", err)
5453
++	}
5454
++}
5455
++
5456
++func TestPrivilegedNamespace(t *testing.T) {
5457
++	tests := map[string]struct {
5458
++		operation          kadmission.Operation
5459
++		pod                *kapi.Pod
5460
++		name               string
5461
++		userInfo           user.Info
5462
++		shouldPassValidate bool
5463
++	}{
5464
++		"denied: regular lightwave user creates pod in vke-system namespace": {
5465
++			operation:          kadmission.Create,
5466
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5467
++			userInfo:           newTestUserBuilder().build(),
5468
++			shouldPassValidate: false,
5469
++		},
5470
++		"denied: regular lightwave user cannot escalate privilege using service account": {
5471
++			operation:          kadmission.Create,
5472
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).withServiceAccount(privilegedServiceAccount + "default").build(),
5473
++			userInfo:           newTestUserBuilder().build(),
5474
++			shouldPassValidate: false,
5475
++		},
5476
++		"denied: regular service account creates pod in vke-system namespace": {
5477
++			operation:          kadmission.Create,
5478
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5479
++			userInfo:           newTestUserBuilder().withName("system:serviceaccount:kube-system:default").build(),
5480
++			shouldPassValidate: false,
5481
++		},
5482
++		"allowed: privileged service account deletes a pod in privileged namespace": {
5483
++			operation:          kadmission.Delete,
5484
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5485
++			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5486
++			shouldPassValidate: true,
5487
++		},
5488
++		"denied: privileged service account creates a pod in privileged namespace": {
5489
++			operation:          kadmission.Create,
5490
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5491
++			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5492
++			shouldPassValidate: false,
5493
++		},
5494
++		"denied: privileged service account execs into a pod in privileged namespace": {
5495
++			operation:          kadmission.Connect,
5496
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5497
++			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5498
++			shouldPassValidate: false,
5499
++		},
5500
++		"denied: privileged service account updates a pod in privileged namespace": {
5501
++			operation:          kadmission.Update,
5502
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5503
++			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5504
++			shouldPassValidate: false,
5505
++		},
5506
++		"allowed: regular user creates pod in other namespace": {
5507
++			operation:          kadmission.Create,
5508
++			pod:                newTestPodBuilder().withNamespace("default").build(),
5509
++			userInfo:           newTestUserBuilder().build(),
5510
++			shouldPassValidate: true,
5511
++		},
5512
++		"allowed: Cascade Controller Service Account creates pod in vke-system namespace": {
5513
++			operation:          kadmission.Create,
5514
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5515
++			userInfo:           newTestUserBuilder().withGroup(testServiceAccountsGroup).build(),
5516
++			shouldPassValidate: true,
5517
++		},
5518
++		"allowed: systemMasters group creates pod in vke-system namespace": {
5519
++			operation:          kadmission.Create,
5520
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5521
++			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5522
++			shouldPassValidate: true,
5523
++		},
5524
++		"denied: regular lightwave group does not grant privileged access": {
5525
++			operation:          kadmission.Create,
5526
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5527
++			userInfo:           newTestUserBuilder().withGroup("test1\\group1").build(),
5528
++			shouldPassValidate: false,
5529
++		},
5530
++		"allowed: if user has multiple groups, any privileged group can grant privileged access": {
5531
++			operation:          kadmission.Create,
5532
++			pod:                newTestPodBuilder().withNamespace(privilegedNamespace).build(),
5533
++			userInfo:           newTestUserBuilder().withGroup("test1\\group1").withGroup(testServiceAccountsGroup).build(),
5534
++			shouldPassValidate: true,
5535
++		},
5536
++		"denied: worker kubelet exec into pod": {
5537
++			operation:          kadmission.Connect,
5538
++			pod:                newTestPodBuilder().build(),
5539
++			userInfo:           newTestUserBuilder().withGroup("system:worker").build(),
5540
++			shouldPassValidate: false,
5541
++		},
5542
++	}
5543
++	for k, v := range tests {
5544
++		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
5545
++	}
5546
++}
5547
++
5548
++func TestToleration(t *testing.T) {
5549
++	tests := map[string]struct {
5550
++		operation          kadmission.Operation
5551
++		pod                *kapi.Pod
5552
++		name               string
5553
++		userInfo           user.Info
5554
++		shouldPassValidate bool
5555
++	}{
5556
++		"allowed: create pod with no toleration": {
5557
++			operation:          kadmission.Create,
5558
++			pod:                newTestPodBuilder().build(),
5559
++			userInfo:           newTestUserBuilder().build(),
5560
++			shouldPassValidate: true,
5561
++		},
5562
++		"allowed: create pod with normal toleration key": {
5563
++			operation:          kadmission.Create,
5564
++			pod:                newTestPodBuilder().withToleration("mykey", reservedTolerationValue, kapi.TolerationOpEqual, kapi.TaintEffectNoSchedule).build(),
5565
++			userInfo:           newTestUserBuilder().build(),
5566
++			shouldPassValidate: true,
5567
++		},
5568
++		"allowed: create pod with normal toleration value": {
5569
++			operation:          kadmission.Create,
5570
++			pod:                newTestPodBuilder().withToleration(reservedTolerationKey, "myval", kapi.TolerationOpEqual, kapi.TaintEffectNoSchedule).build(),
5571
++			userInfo:           newTestUserBuilder().build(),
5572
++			shouldPassValidate: true,
5573
++		},
5574
++		"denied: create pod with reserved toleration": {
5575
++			operation:          kadmission.Create,
5576
++			pod:                newTestPodBuilder().withToleration(reservedTolerationKey, reservedTolerationValue, kapi.TolerationOpEqual, kapi.TaintEffectNoSchedule).build(),
5577
++			userInfo:           newTestUserBuilder().build(),
5578
++			shouldPassValidate: false,
5579
++		},
5580
++		"denied: create pod with wildcard toleration": {
5581
++			operation:          kadmission.Create,
5582
++			pod:                newTestPodBuilder().withToleration("", "", kapi.TolerationOpExists, "").build(),
5583
++			userInfo:           newTestUserBuilder().build(),
5584
++			shouldPassValidate: false,
5585
++		},
5586
++		"denied: create pod with value wildcard toleration": {
5587
++			operation:          kadmission.Create,
5588
++			pod:                newTestPodBuilder().withToleration(reservedTolerationKey, "", kapi.TolerationOpExists, kapi.TaintEffectNoSchedule).build(),
5589
++			userInfo:           newTestUserBuilder().build(),
5590
++			shouldPassValidate: false,
5591
++		},
5592
++		"allowed: create pod with value wildcard and normal key": {
5593
++			operation:          kadmission.Create,
5594
++			pod:                newTestPodBuilder().withToleration("mykey", "", kapi.TolerationOpExists, kapi.TaintEffectNoSchedule).build(),
5595
++			userInfo:           newTestUserBuilder().build(),
5596
++			shouldPassValidate: true,
5597
++		},
5598
++	}
5599
++
5600
++	for k, v := range tests {
5601
++		testPodValidation(k, v.operation, v.pod, v.name, v.userInfo, v.shouldPassValidate, t)
5602
++	}
5603
++}
5604
++
5605
++func TestClusterLevelResources(t *testing.T) {
5606
++	tests := map[string]struct {
5607
++		operation          kadmission.Operation
5608
++		resource           string
5609
++		subresource        string
5610
++		name               string
5611
++		namespace          string
5612
++		userInfo           user.Info
5613
++		object             runtime.Object
5614
++		oldObject          runtime.Object
5615
++		shouldPassValidate bool
5616
++	}{
5617
++		"denied: regular lightwave user update configmaps in vke-system namespace": {
5618
++			operation:          kadmission.Update,
5619
++			resource:           "configmaps",
5620
++			namespace:          privilegedNamespace,
5621
++			userInfo:           newTestUserBuilder().build(),
5622
++			shouldPassValidate: false,
5623
++		},
5624
++		"denied: regular lightwave user delete daemonsets in vke-system namespace": {
5625
++			operation:          kadmission.Delete,
5626
++			resource:           "daemonsets",
5627
++			namespace:          privilegedNamespace,
5628
++			userInfo:           newTestUserBuilder().build(),
5629
++			shouldPassValidate: false,
5630
++		},
5631
++		"denied: regular lightwave user create deployments in vke-system namespace": {
5632
++			operation:          kadmission.Create,
5633
++			resource:           "deployments",
5634
++			namespace:          privilegedNamespace,
5635
++			userInfo:           newTestUserBuilder().build(),
5636
++			shouldPassValidate: false,
5637
++		},
5638
++		"denied: regular lightwave user create rolebindings in vke-system namespace": {
5639
++			operation:          kadmission.Create,
5640
++			resource:           "rolebindings",
5641
++			namespace:          privilegedNamespace,
5642
++			userInfo:           newTestUserBuilder().build(),
5643
++			shouldPassValidate: false,
5644
++		},
5645
++		"allowed: regular lightwave user create rolebindings in other namespace": {
5646
++			operation:          kadmission.Create,
5647
++			resource:           "rolebindings",
5648
++			namespace:          "default",
5649
++			userInfo:           newTestUserBuilder().build(),
5650
++			shouldPassValidate: true,
5651
++		},
5652
++		"allowed: regular lightwave user create clusterroles": {
5653
++			operation:          kadmission.Create,
5654
++			resource:           "clusterroles",
5655
++			name:               "cluster-role",
5656
++			namespace:          "",
5657
++			userInfo:           newTestUserBuilder().build(),
5658
++			shouldPassValidate: true,
5659
++		},
5660
++		"denied: regular lightwave user create clusterroles with vke: prefix": {
5661
++			operation:          kadmission.Create,
5662
++			resource:           "clusterroles",
5663
++			name:               "vke:clusterrole",
5664
++			namespace:          "",
5665
++			userInfo:           newTestUserBuilder().build(),
5666
++			shouldPassValidate: false,
5667
++		},
5668
++		"denied: regular lightwave user delete clusterroles with vke: prefix": {
5669
++			operation:          kadmission.Delete,
5670
++			resource:           "clusterroles",
5671
++			name:               "vke:clusterrole",
5672
++			namespace:          "",
5673
++			userInfo:           newTestUserBuilder().build(),
5674
++			shouldPassValidate: false,
5675
++		},
5676
++		"allowed: systemMasters group update clusterroles with vke: prefix": {
5677
++			operation:          kadmission.Update,
5678
++			resource:           "clusterroles",
5679
++			name:               "vke:clusterrole",
5680
++			namespace:          "",
5681
++			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5682
++			shouldPassValidate: true,
5683
++		},
5684
++		"allowed: regular lightwave user create clusterrolebindings": {
5685
++			operation:          kadmission.Create,
5686
++			resource:           "clusterrolebindings",
5687
++			name:               "cluster-role-binding",
5688
++			namespace:          "",
5689
++			userInfo:           newTestUserBuilder().build(),
5690
++			shouldPassValidate: true,
5691
++		},
5692
++		"denied: regular lightwave user create clusterrolebindings with vke: prefix": {
5693
++			operation:          kadmission.Create,
5694
++			resource:           "clusterrolebindings",
5695
++			name:               "vke:clusterrolebinding",
5696
++			namespace:          "",
5697
++			userInfo:           newTestUserBuilder().build(),
5698
++			shouldPassValidate: false,
5699
++		},
5700
++		"denied: regular lightwave user update clusterrolebindings with vke: prefix": {
5701
++			operation:          kadmission.Delete,
5702
++			resource:           "clusterrolebindings",
5703
++			name:               "vke:clusterrolebinding",
5704
++			namespace:          "",
5705
++			userInfo:           newTestUserBuilder().build(),
5706
++			shouldPassValidate: false,
5707
++		},
5708
++		"allowed: systemMastersGroup update clusterrolebindings with vke: prefix": {
5709
++			operation:          kadmission.Update,
5710
++			resource:           "clusterrolebindings",
5711
++			name:               "vke:clusterrolebinding",
5712
++			namespace:          "",
5713
++			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5714
++			shouldPassValidate: true,
5715
++		},
5716
++		"allowed: regular lightwave user update worker nodes": {
5717
++			operation:          kadmission.Update,
5718
++			resource:           "nodes",
5719
++			name:               "worker-guid",
5720
++			namespace:          "",
5721
++			userInfo:           newTestUserBuilder().build(),
5722
++			shouldPassValidate: true,
5723
++		},
5724
++		"allowed: regular lightwave user get worker nodes proxy subresource": {
5725
++			operation:          kadmission.Connect,
5726
++			resource:           "nodes",
5727
++			subresource:        "proxy",
5728
++			name:               "worker-guid",
5729
++			namespace:          "",
5730
++			userInfo:           newTestUserBuilder().build(),
5731
++			shouldPassValidate: true,
5732
++		},
5733
++		"allowed: regular lightwave user patch worker nodes proxy subresource": {
5734
++			operation:          kadmission.Update,
5735
++			resource:           "nodes",
5736
++			subresource:        "proxy",
5737
++			name:               "worker-guid",
5738
++			namespace:          "",
5739
++			userInfo:           newTestUserBuilder().build(),
5740
++			shouldPassValidate: true,
5741
++		},
5742
++		"allowed: regular lightwave user create worker nodes proxy subresource": {
5743
++			operation:          kadmission.Create,
5744
++			resource:           "nodes",
5745
++			subresource:        "proxy",
5746
++			name:               "worker-guid",
5747
++			namespace:          "",
5748
++			userInfo:           newTestUserBuilder().build(),
5749
++			shouldPassValidate: true,
5750
++		},
5751
++		"allowed: regular lightwave user get master nodes proxy subresource": {
5752
++			operation:          kadmission.Connect,
5753
++			resource:           "nodes",
5754
++			subresource:        "proxy",
5755
++			name:               "master-guid",
5756
++			namespace:          "",
5757
++			userInfo:           newTestUserBuilder().build(),
5758
++			shouldPassValidate: true,
5759
++		},
5760
++		"denied: regular lightwave user patch master nodes proxy subresource": {
5761
++			operation:          kadmission.Update,
5762
++			resource:           "nodes",
5763
++			subresource:        "proxy",
5764
++			name:               "master-guid",
5765
++			namespace:          "",
5766
++			userInfo:           newTestUserBuilder().build(),
5767
++			shouldPassValidate: false,
5768
++		},
5769
++		"denied: regular lightwave user create master nodes proxy subresource": {
5770
++			operation:          kadmission.Create,
5771
++			resource:           "nodes",
5772
++			subresource:        "proxy",
5773
++			name:               "master-guid",
5774
++			namespace:          "",
5775
++			userInfo:           newTestUserBuilder().build(),
5776
++			shouldPassValidate: false,
5777
++		},
5778
++		"denied: regular lightwave user update master nodes": {
5779
++			operation:          kadmission.Update,
5780
++			resource:           "nodes",
5781
++			name:               "master-guid",
5782
++			namespace:          "",
5783
++			userInfo:           newTestUserBuilder().build(),
5784
++			shouldPassValidate: false,
5785
++		},
5786
++		"denied: regular lightwave user delete master nodes": {
5787
++			operation:          kadmission.Delete,
5788
++			resource:           "nodes",
5789
++			name:               "master-guid",
5790
++			namespace:          "",
5791
++			userInfo:           newTestUserBuilder().build(),
5792
++			shouldPassValidate: false,
5793
++		},
5794
++		"denied: regular lightwave user delete worker nodes": {
5795
++			operation:          kadmission.Delete,
5796
++			resource:           "nodes",
5797
++			name:               "worker-guid",
5798
++			namespace:          "",
5799
++			userInfo:           newTestUserBuilder().build(),
5800
++			shouldPassValidate: false,
5801
++		},
5802
++		"allowed: systemMasters group update nodes": {
5803
++			operation:          kadmission.Update,
5804
++			resource:           "nodes",
5805
++			namespace:          "",
5806
++			userInfo:           newTestUserBuilder().withGroup(systemMastersGroup).build(),
5807
++			shouldPassValidate: true,
5808
++		},
5809
++		"allowed: kubelet update node": {
5810
++			operation:          kadmission.Update,
5811
++			resource:           "nodes",
5812
++			namespace:          "",
5813
++			userInfo:           newTestUserBuilder().withGroup(systemNodesGroup).build(),
5814
++			shouldPassValidate: true,
5815
++		},
5816
++		"allowed: privileged service account update worker node taint": {
5817
++			operation:          kadmission.Update,
5818
++			resource:           "nodes",
5819
++			namespace:          "",
5820
++			name:               "worker-guid",
5821
++			oldObject:          newTestNodeBuilder().build(),
5822
++			object:             newTestNodeBuilder().withTaint(nil).build(),
5823
++			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5824
++			shouldPassValidate: true,
5825
++		},
5826
++		"denied: privileged service account update master node taint": {
5827
++			operation:          kadmission.Update,
5828
++			resource:           "nodes",
5829
++			namespace:          "",
5830
++			name:               "master-guid",
5831
++			oldObject:          newTestNodeBuilder().build(),
5832
++			object:             newTestNodeBuilder().withTaint(nil).build(),
5833
++			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5834
++			shouldPassValidate: false,
5835
++		},
5836
++		"denied: privileged service account create a deployment": {
5837
++			operation:          kadmission.Create,
5838
++			resource:           "deployments",
5839
++			namespace:          "vke-system",
5840
++			userInfo:           newTestUserBuilder().withName(privilegedServiceAccount + "default").build(),
5841
++			shouldPassValidate: false,
5842
++		},
5843
++		"denied: worker kubelet create a deployment": {
5844
++			operation:          kadmission.Create,
5845
++			resource:           "deployments",
5846
++			namespace:          "vke-system",
5847
++			userInfo:           newTestUserBuilder().withGroup(systemWorkerGroup).build(),
5848
++			shouldPassValidate: false,
5849
++		},
5850
++		"denied: regular lightwave user creates a PV of type hostPath": {
5851
++			operation:          kadmission.Create,
5852
++			resource:           "persistentvolumes",
5853
++			namespace:          "",
5854
++			name:               "test-pv",
5855
++			object:             getHostPathPV(),
5856
++			userInfo:           newTestUserBuilder().build(),
5857
++			shouldPassValidate: false,
5858
++		},
5859
++		"allowed: regular lightwave user deletes a PV": {
5860
++			operation:          kadmission.Delete,
5861
++			resource:           "persistentvolumes",
5862
++			namespace:          "",
5863
++			name:               "test-pv",
5864
++			userInfo:           newTestUserBuilder().build(),
5865
++			shouldPassValidate: true,
5866
++		},
5867
++	}
5868
++	for k, v := range tests {
5869
++		testResourceValidation(k, v.operation, v.resource, v.subresource, v.name, v.namespace, v.userInfo, v.object,
5870
++			v.oldObject, v.shouldPassValidate, t)
5871
++	}
5872
++}
5873
++
5874
++func testPodValidation(testCaseName string, op kadmission.Operation, pod *kapi.Pod, name string, userInfo user.Info,
5875
++	shouldPassValidate bool, t *testing.T) {
5876
++
5877
++	defaultConfigFile := fmt.Sprintf(defaultConfigFileFormat, testServiceAccountsGroup, pspFileName, clusterID)
5878
++	configFile := strings.NewReader(defaultConfigFile)
5879
++	plugin, err := NewVMwareAdmissionController(configFile)
5880
++	if err != nil {
5881
++		t.Errorf("%s: failed to create admission controller %v", testCaseName, err)
5882
++	}
5883
++
5884
++	namespace := "default"
5885
++	if pod != nil {
5886
++		namespace = pod.Namespace
5887
++	}
5888
++
5889
++	attrs := kadmission.NewAttributesRecord(pod, nil, kapi.Kind("Pod").WithVersion("version"),
5890
++		namespace, name, kapi.Resource("pods").WithVersion("version"), "", op, userInfo)
5891
++
5892
++	err = plugin.Validate(attrs)
5893
++	if shouldPassValidate && err != nil {
5894
++		t.Errorf("%s: expected no errors on Validate but received %v", testCaseName, err)
5895
++	} else if !shouldPassValidate && err == nil {
5896
++		t.Errorf("%s: expected errors on Validate but received none", testCaseName)
5897
++	}
5898
++}
5899
++
5900
++func testResourceValidation(testCaseName string, op kadmission.Operation, resource, subresource, name, namespace string,
5901
++	userInfo user.Info, object runtime.Object, oldObject runtime.Object, shouldPassValidate bool, t *testing.T) {
5902
++
5903
++	defaultConfigFile := fmt.Sprintf(defaultConfigFileFormat, testServiceAccountsGroup, pspFileName, clusterID)
5904
++	configFile := strings.NewReader(defaultConfigFile)
5905
++	plugin, err := NewVMwareAdmissionController(configFile)
5906
++	if err != nil {
5907
++		t.Errorf("%s: failed to create admission controller %v", testCaseName, err)
5908
++	}
5909
++
5910
++	groupResource := kapi.Resource(resource).WithVersion("version")
5911
++	if resource == "clusterroles" || resource == "clusterrolebindings" {
5912
++		groupResource = rbac.Resource(resource).WithVersion("version")
5913
++	}
5914
++
5915
++	attrs := kadmission.NewAttributesRecord(object, oldObject, kapi.Kind("kind").WithVersion("version"),
5916
++		namespace, name, groupResource, subresource, op, userInfo)
5917
++
5918
++	err = plugin.Validate(attrs)
5919
++	if shouldPassValidate && err != nil {
5920
++		t.Errorf("%s: expected no errors on Validate but received %v", testCaseName, err)
5921
++	} else if !shouldPassValidate && err == nil {
5922
++		t.Errorf("%s: expected errors on Validate but received none", testCaseName)
5923
++	}
5924
++}
5925
++
5926
++// testPodBuilder
5927
++type testPodBuilder struct {
5928
++	pod kapi.Pod
5929
++}
5930
++
5931
++func newTestPodBuilder() *testPodBuilder {
5932
++	builder := new(testPodBuilder)
5933
++	return builder.init()
5934
++}
5935
++
5936
++func (p *testPodBuilder) init() *testPodBuilder {
5937
++	p.pod = kapi.Pod{
5938
++		ObjectMeta: metav1.ObjectMeta{
5939
++			Name:        "pod",
5940
++			Namespace:   "namespace",
5941
++			Annotations: map[string]string{},
5942
++		},
5943
++		Spec: kapi.PodSpec{
5944
++			ServiceAccountName: "default",
5945
++			SecurityContext:    &kapi.PodSecurityContext{},
5946
++			Containers: []kapi.Container{
5947
++				{
5948
++					Name:            "test-container-1",
5949
++					SecurityContext: &kapi.SecurityContext{},
5950
++				},
5951
++			},
5952
++		},
5953
++	}
5954
++	return p
5955
++}
5956
++
5957
++func (p *testPodBuilder) build() *kapi.Pod {
5958
++	return &p.pod
5959
++}
5960
++
5961
++func (p *testPodBuilder) withNamespace(namespace string) *testPodBuilder {
5962
++	p.pod.ObjectMeta.Namespace = namespace
5963
++	return p
5964
++}
5965
++
5966
++func (p *testPodBuilder) withServiceAccount(sa string) *testPodBuilder {
5967
++	p.pod.Spec.ServiceAccountName = sa
5968
++	return p
5969
++}
5970
++
5971
++func (p *testPodBuilder) withPrivileged(v bool) *testPodBuilder {
5972
++	p.pod.Spec.Containers[0].SecurityContext.Privileged = &v
5973
++	return p
5974
++}
5975
++
5976
++func (p *testPodBuilder) withHostNetwork(v bool) *testPodBuilder {
5977
++	p.pod.Spec.SecurityContext.HostNetwork = v
5978
++	return p
5979
++}
5980
++
5981
++func (p *testPodBuilder) withHostIPC(v bool) *testPodBuilder {
5982
++	p.pod.Spec.SecurityContext.HostIPC = v
5983
++	return p
5984
++}
5985
++
5986
++func (p *testPodBuilder) withHostPID(v bool) *testPodBuilder {
5987
++	p.pod.Spec.SecurityContext.HostPID = v
5988
++	return p
5989
++}
5990
++
5991
++func (p *testPodBuilder) withHostPort() *testPodBuilder {
5992
++	containerPorts := []kapi.ContainerPort{
5993
++		{
5994
++			HostPort:      3000,
5995
++			ContainerPort: 80,
5996
++		},
5997
++	}
5998
++
5999
++	p.pod.Spec.Containers[0].Ports = containerPorts
6000
++	return p
6001
++}
6002
++
6003
++func (p *testPodBuilder) withHostVolume(hostPath string, readOnly bool) *testPodBuilder {
6004
++	volume := kapi.Volume{
6005
++		Name: "host",
6006
++		VolumeSource: kapi.VolumeSource{
6007
++			HostPath: &kapi.HostPathVolumeSource{
6008
++				Path: hostPath,
6009
++			},
6010
++		},
6011
++	}
6012
++	volumeMount := kapi.VolumeMount{Name: "host", MountPath: "/data", ReadOnly: readOnly}
6013
++
6014
++	p.pod.Spec.Volumes = append(p.pod.Spec.Volumes, volume)
6015
++	p.pod.Spec.Containers[0].VolumeMounts = append(p.pod.Spec.Containers[0].VolumeMounts, volumeMount)
6016
++	return p
6017
++}
6018
++
6019
++func (p *testPodBuilder) withCascadeDisk() *testPodBuilder {
6020
++	volume := kapi.Volume{
6021
++		Name: "cascadeDisk",
6022
++		VolumeSource: kapi.VolumeSource{
6023
++			PersistentVolumeClaim: &kapi.PersistentVolumeClaimVolumeSource{
6024
++				ClaimName: "00000000-0000-0000-0000-000000000001",
6025
++				ReadOnly:  false,
6026
++			},
6027
++		},
6028
++	}
6029
++	device := kapi.VolumeDevice{Name: "cascadeDisk", DevicePath: "/cascadeDisk"}
6030
++
6031
++	p.pod.Spec.Volumes = append(p.pod.Spec.Volumes, volume)
6032
++	p.pod.Spec.Containers[0].VolumeDevices = append(p.pod.Spec.Containers[0].VolumeDevices, device)
6033
++	return p
6034
++}
6035
++
6036
++func (p *testPodBuilder) withContainer() *testPodBuilder {
6037
++	container := kapi.Container{
6038
++		Name:            "test-container-2",
6039
++		SecurityContext: &kapi.SecurityContext{},
6040
++	}
6041
++
6042
++	p.pod.Spec.Containers = append(p.pod.Spec.Containers, container)
6043
++	return p
6044
++}
6045
++
6046
++func (p *testPodBuilder) withInitContainer() *testPodBuilder {
6047
++	container := kapi.Container{
6048
++		Name:            "test-init-container",
6049
++		SecurityContext: &kapi.SecurityContext{},
6050
++	}
6051
++
6052
++	p.pod.Spec.Containers = append(p.pod.Spec.Containers, container)
6053
++	return p
6054
++}
6055
++
6056
++func (p *testPodBuilder) withToleration(key, value string, operator kapi.TolerationOperator, effect kapi.TaintEffect) *testPodBuilder {
6057
++	p.pod.Spec.Tolerations = append(p.pod.Spec.Tolerations, kapi.Toleration{
6058
++		Key:      key,
6059
++		Value:    value,
6060
++		Operator: operator,
6061
++		Effect:   effect,
6062
++	})
6063
++	return p
6064
++}
6065
++
6066
++// testUserBuilder
6067
++type testUserBuilder struct {
6068
++	user *user.DefaultInfo
6069
++}
6070
++
6071
++func newTestUserBuilder() *testUserBuilder {
6072
++	builder := new(testUserBuilder)
6073
++	return builder.init()
6074
++}
6075
++
6076
++func (p *testUserBuilder) init() *testUserBuilder {
6077
++	p.user = &user.DefaultInfo{
6078
++		Name:   "https://lightwave.cascade-cloud.com/openidconnect/00000000-0000-0000-0000-000000000001#joe@vmware.com",
6079
++		UID:    "10001",
6080
++		Groups: []string{},
6081
++	}
6082
++	return p
6083
++}
6084
++
6085
++func (p *testUserBuilder) build() *user.DefaultInfo {
6086
++	return p.user
6087
++}
6088
++
6089
++func (p *testUserBuilder) withName(name string) *testUserBuilder {
6090
++	p.user.Name = name
6091
++	return p
6092
++}
6093
++
6094
++func (p *testUserBuilder) withGroup(group string) *testUserBuilder {
6095
++	p.user.Groups = append(p.user.Groups, group)
6096
++	return p
6097
++}
6098
++
6099
++// testNodeBuilder
6100
++type testNodeBuilder struct {
6101
++	node kapi.Node
6102
++}
6103
++
6104
++func newTestNodeBuilder() *testNodeBuilder {
6105
++	builder := new(testNodeBuilder)
6106
++	return builder.init()
6107
++}
6108
++
6109
++func (n *testNodeBuilder) init() *testNodeBuilder {
6110
++	n.node = kapi.Node{
6111
++		ObjectMeta: metav1.ObjectMeta{
6112
++			Name:        "node",
6113
++			Namespace:   "",
6114
++			Annotations: nil,
6115
++		},
6116
++		Spec: kapi.NodeSpec{
6117
++			Taints: []kapi.Taint{
6118
++				{
6119
++					"Dedicated", "Master", "NoSchedule", nil,
6120
++				},
6121
++			},
6122
++		},
6123
++	}
6124
++	return n
6125
++}
6126
++
6127
++func (n *testNodeBuilder) build() *kapi.Node {
6128
++	return &n.node
6129
++}
6130
++
6131
++func (n *testNodeBuilder) withTaint(taints []kapi.Taint) *testNodeBuilder {
6132
++	n.node.Spec.Taints = taints
6133
++	return n
6134
++}
6135
++
6136
++func getHostPathPV() *kapi.PersistentVolume {
6137
++	return &kapi.PersistentVolume{
6138
++		ObjectMeta: metav1.ObjectMeta{
6139
++			Name:        "test-pv",
6140
++			Namespace:   "",
6141
++			Annotations: nil,
6142
++		},
6143
++		Spec: kapi.PersistentVolumeSpec{
6144
++			StorageClassName: "manual",
6145
++			PersistentVolumeSource: kapi.PersistentVolumeSource{
6146
++				HostPath: &kapi.HostPathVolumeSource{
6147
++					Path: "/",
6148
++				},
6149
++			},
6150
++		},
6151
++	}
6152
++}
6153
+diff --git a/plugin/pkg/auth/authorizer/vke/BUILD b/plugin/pkg/auth/authorizer/vke/BUILD
6154
+new file mode 100644
6155
+index 0000000..4b984f1
6156
+--- /dev/null
6157
+@@ -0,0 +1,40 @@
6158
++package(default_visibility = ["//visibility:public"])
6159
++
6160
++load(
6161
++    "@io_bazel_rules_go//go:def.bzl",
6162
++    "go_library",
6163
++)
6164
++
6165
++go_test(
6166
++    name = "go_default_test",
6167
++    srcs = ["vke_authorizer_test.go"],
6168
++    embed = [":go_default_library"],
6169
++    deps = [
6170
++        "//vendor/k8s.io/apiserver/pkg/authentication/user:go_default_library",
6171
++        "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
6172
++    ],
6173
++)
6174
++
6175
++go_library(
6176
++    name = "go_default_library",
6177
++    srcs = [
6178
++        "vke_authorizer.go",
6179
++    ],
6180
++    importpath = "k8s.io/kubernetes/plugin/pkg/auth/authorizer/vke",
6181
++    deps = [
6182
++        "//vendor/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
6183
++    ],
6184
++)
6185
++
6186
++filegroup(
6187
++    name = "package-srcs",
6188
++    srcs = glob(["**"]),
6189
++    tags = ["automanaged"],
6190
++    visibility = ["//visibility:private"],
6191
++)
6192
++
6193
++filegroup(
6194
++    name = "all-srcs",
6195
++    srcs = [":package-srcs"],
6196
++    tags = ["automanaged"],
6197
++)
6198
+diff --git a/plugin/pkg/auth/authorizer/vke/OWNERS b/plugin/pkg/auth/authorizer/vke/OWNERS
6199
+new file mode 100644
6200
+index 0000000..c3a4ed7
6201
+--- /dev/null
6202
+@@ -0,0 +1,2 @@
6203
++maintainers:
6204
++- ashokc
6205
+diff --git a/plugin/pkg/auth/authorizer/vke/vke_authorizer.go b/plugin/pkg/auth/authorizer/vke/vke_authorizer.go
6206
+new file mode 100644
6207
+index 0000000..6d7f9ae
6208
+--- /dev/null
6209
+@@ -0,0 +1,125 @@
6210
++package vke
6211
++
6212
++import (
6213
++	"bufio"
6214
++	"fmt"
6215
++	"os"
6216
++	"strings"
6217
++
6218
++	"github.com/golang/glog"
6219
++	"k8s.io/apiserver/pkg/authorization/authorizer"
6220
++)
6221
++
6222
++const (
6223
++	systemClusterPrefix = "system:clusterID:"
6224
++	systemNodePrefix    = "system:node:"
6225
++	systemWorkerGroup   = "system:worker"
6226
++	masterPrefix        = "master-"
6227
++)
6228
++
6229
++
6230
++// VKEAuthorizer authorizes requests which comes from nodes using certificates.
6231
++// If a request is from a node which is not a part of the cluster, reject.
6232
++type VKEAuthorizer struct {
6233
++	clusterID string
6234
++}
6235
++
6236
++// NewAuthorizer returns a new node authorizer
6237
++func NewAuthorizer() (authorizer.Authorizer, error) {
6238
++	file, err := os.Open("/etc/kubernetes/cc_cloud.config")
6239
++	if err != nil {
6240
++		return nil, err
6241
++	}
6242
++	defer file.Close()
6243
++
6244
++	scanner := bufio.NewScanner(file)
6245
++
6246
++	for scanner.Scan() {
6247
++		lineContent := scanner.Text()
6248
++		if strings.Contains(lineContent, "clusterID = ") {
6249
++			clusterID := strings.SplitAfter(lineContent, "= ")[1]
6250
++			return &VKEAuthorizer{clusterID: clusterID}, nil
6251
++		}
6252
++	}
6253
++
6254
++	return nil, fmt.Errorf("Cluster ID cannot be parsed from config file successfully")
6255
++}
6256
++
6257
++// Authorize authorizes requests based on the VKE authorizer.
6258
++func (v *VKEAuthorizer) Authorize(attrs authorizer.Attributes) (authorizer.Decision, string, error) {
6259
++	// If the request comes from a non cluster node, then deny.
6260
++	if isNonClusterNode(attrs, v.clusterID) {
6261
++		glog.V(2).Infof("VKE authorizer: DENY the request because it is from a different cluster")
6262
++		return authorizer.DecisionDeny, "", nil
6263
++	}
6264
++
6265
++	// If a worker node name does not have the node prefix, then deny. This is needed for the request to go through node
6266
++	// authorizer and node restriction admission controller. If it is not set, then a user can bypass node authorizer
6267
++	// and the node restriction admission controller and modify the master node.
6268
++	if isWorkerWithoutNodeNameRestriction(attrs) {
6269
++		glog.V(2).Infof("VKE authorizer: DENY the request because the node name restriction is not met")
6270
++		return authorizer.DecisionDeny, "", nil
6271
++	}
6272
++
6273
++	// If it is a proxy request to the master node to exec, run or attach to a container, then deny.
6274
++	if isProxyRequestToMasterNode(attrs) {
6275
++		glog.V(2).Infof("VKE authorizer: DENY the request because it tried to execute commands on master pods")
6276
++		return authorizer.DecisionDeny, "", nil
6277
++	}
6278
++
6279
++	return authorizer.DecisionNoOpinion, "", nil
6280
++}
6281
++
6282
++// isNonClusterNode verifies that the request is not from a node which does not belong to this cluster. This is needed
6283
++// to prevent cross cluster attacks where a user can use the kubelet certificate of one cluster to access the resources
6284
++// in another cluster. The reason we have this check is because, when a certificate is presented for authentication,
6285
++// Kubernetes just verifies that the certificate is signed by the CA that the cluster trusts. Since, in our case, the CA
6286
++// is same for all clusters, authentication with certificate is not enough. So, we make sure that the request is not
6287
++// from another cluster. Lightwave will make sure that any certificates generated on a worker will always have the
6288
++// "system:clusterID:<id>" group. This way, we can just check the cluster ID in the group and reject if it is not the
6289
++// same as this cluster's ID.
6290
++func isNonClusterNode(attrs authorizer.Attributes, clusterID string) bool {
6291
++	groups := attrs.GetUser().GetGroups()
6292
++	for _, group := range groups {
6293
++		if strings.HasPrefix(group, systemClusterPrefix) {
6294
++			groupParts := strings.Split(group, ":")
6295
++			if clusterID != "" && groupParts[len(groupParts)-1] != clusterID {
6296
++				return true
6297
++			}
6298
++		}
6299
++	}
6300
++
6301
++	return false
6302
++}
6303
++
6304
++// isWorkerWithoutNodeNameRestriction verifies that the certificate presented by the worker nodes also have the
6305
++// appropriate name "system:node:<hostname>". We need to validate this because it is possible for a user to generate
6306
++// certificates with CN other than "system:node:<hostname>". This is because lightwave does group validation and that
6307
++// the CNs can be one of system:node:<hostname>, kubernetes-master and etcd. When that happens, that certificate will be
6308
++// able to bypass the NodeRestriction admission controller which will allow access to modify master node and create pods
6309
++// on master. To prevent that from happening, we need to verify that if a request comes from a worker node, then it has
6310
++// to have the expected name so that NodeRestriction admission controller is enforced.
6311
++func isWorkerWithoutNodeNameRestriction(attrs authorizer.Attributes) bool {
6312
++	groups := attrs.GetUser().GetGroups()
6313
++	name := attrs.GetUser().GetName()
6314
++	for _, group := range groups {
6315
++		if group == systemWorkerGroup && !strings.HasPrefix(name, systemNodePrefix) {
6316
++			return true
6317
++		}
6318
++	}
6319
++	return false
6320
++}
6321
++
6322
++// isProxyRequestToMasterNode checks if the request is made to exec, run or attach to a container on the master node. We
6323
++// need this check because we do not want to allow a user to exec into a privileged pod on the master node.
6324
++func isProxyRequestToMasterNode(attrs authorizer.Attributes) bool {
6325
++	if attrs.GetResource() == "nodes" && strings.HasPrefix(attrs.GetName(), masterPrefix) {
6326
++		if strings.Contains(attrs.GetPath(), "proxy/run") ||
6327
++			strings.Contains(attrs.GetPath(), "proxy/exec") ||
6328
++			strings.Contains(attrs.GetPath(), "proxy/attach") {
6329
++			return true
6330
++		}
6331
++	}
6332
++	return false
6333
++}
6334
++
6335
+diff --git a/plugin/pkg/auth/authorizer/vke/vke_authorizer_test.go b/plugin/pkg/auth/authorizer/vke/vke_authorizer_test.go
6336
+new file mode 100644
6337
+index 0000000..6aba9ec
6338
+--- /dev/null
6339
+@@ -0,0 +1,230 @@
6340
++package vke
6341
++
6342
++import (
6343
++	"testing"
6344
++
6345
++	"k8s.io/apiserver/pkg/authentication/user"
6346
++	"k8s.io/apiserver/pkg/authorization/authorizer"
6347
++)
6348
++
6349
++const (
6350
++	masterProxyAttachPath = "/api/v1/nodes/master-0/proxy/attach/vke-system/pod-name/container-name"
6351
++	masterProxyExecPath   = "/api/v1/nodes/master-0/proxy/exec/vke-system/pod-name/container-name"
6352
++	masterProxyRunPath    = "/api/v1/nodes/master-0/proxy/run/vke-system/pod-name/container-name"
6353
++	workerProxyAttachPath = "/api/v1/nodes/worker-0/proxy/attach/vke-system/pod-name/container-name"
6354
++	workerProxyExecPath   = "/api/v1/nodes/worker-0/proxy/exec/vke-system/pod-name/container-name"
6355
++	workerProxyRunPath    = "/api/v1/nodes/worker-0/proxy/run/vke-system/pod-name/container-name"
6356
++)
6357
++
6358
++func TestAuthorizer(t *testing.T) {
6359
++	authz := &VKEAuthorizer{clusterID: "cluster-id"}
6360
++
6361
++	clusterNode := &user.DefaultInfo{Name: "system:node:worker-0", Groups: []string{"system:nodes", "system:clusterID:cluster-id", "system:worker"}}
6362
++	crossClusterNode := &user.DefaultInfo{Name: "system:node:worker-0", Groups: []string{"system:nodes", "system:clusterID:invalid", "system:worker"}}
6363
++	invalidWorker := &user.DefaultInfo{Name: "worker-0", Groups: []string{"system:nodes", "system:clusterID:cluster-id", "system:worker"}}
6364
++
6365
++	tests := []struct {
6366
++		name   string
6367
++		attrs  authorizer.AttributesRecord
6368
++		expect authorizer.Decision
6369
++	}{
6370
++		// Do not deny requests from a normal cluster node user.
6371
++		{
6372
++			name:   "allowed: cluster node get pod",
6373
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "get", Resource: "pods", Name: "pod", Namespace: "ns"},
6374
++			expect: authorizer.DecisionNoOpinion,
6375
++		},
6376
++		{
6377
++			name:   "allowed: cluster node list pod",
6378
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "list", Resource: "pods", Namespace: "ns"},
6379
++			expect: authorizer.DecisionNoOpinion,
6380
++		},
6381
++		{
6382
++			name:   "allowed: cluster node create pod",
6383
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "pods", Name: "pod", Namespace: "ns"},
6384
++			expect: authorizer.DecisionNoOpinion,
6385
++		},
6386
++		{
6387
++			name:   "allowed: cluster node update pod",
6388
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "update", Resource: "pods", Name: "pod", Namespace: "ns"},
6389
++			expect: authorizer.DecisionNoOpinion,
6390
++		},
6391
++		{
6392
++			name:   "allowed: cluster node delete pod",
6393
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "delete", Resource: "pods", Name: "pod", Namespace: "ns"},
6394
++			expect: authorizer.DecisionNoOpinion,
6395
++		},
6396
++		{
6397
++			name:   "allowed: cluster node get node",
6398
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "get", Resource: "nodes", Name: "node"},
6399
++			expect: authorizer.DecisionNoOpinion,
6400
++		},
6401
++		{
6402
++			name:   "allowed: cluster node list nodes",
6403
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "list", Resource: "nodes"},
6404
++			expect: authorizer.DecisionNoOpinion,
6405
++		},
6406
++		{
6407
++			name:   "allowed: cluster node create nodes",
6408
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "node"},
6409
++			expect: authorizer.DecisionNoOpinion,
6410
++		},
6411
++		{
6412
++			name:   "allowed: cluster node update nodes",
6413
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "update", Resource: "nodes", Name: "node"},
6414
++			expect: authorizer.DecisionNoOpinion,
6415
++		},
6416
++		{
6417
++			name:   "allowed: cluster node delete nodes",
6418
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "delete", Resource: "nodes", Name: "node"},
6419
++			expect: authorizer.DecisionNoOpinion,
6420
++		},
6421
++
6422
++		// Deny requests from another cluster node.
6423
++		{
6424
++			name:   "denied: cross cluster node get pod",
6425
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "get", Resource: "pods", Name: "pod", Namespace: "ns"},
6426
++			expect: authorizer.DecisionDeny,
6427
++		},
6428
++		{
6429
++			name:   "denied: cross cluster node list pod",
6430
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "list", Resource: "pods", Namespace: "ns"},
6431
++			expect: authorizer.DecisionDeny,
6432
++		},
6433
++		{
6434
++			name:   "denied: cross cluster node create pod",
6435
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "create", Resource: "pods", Name: "pod", Namespace: "ns"},
6436
++			expect: authorizer.DecisionDeny,
6437
++		},
6438
++		{
6439
++			name:   "denied: cross cluster node update pod",
6440
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "update", Resource: "pods", Name: "pod", Namespace: "ns"},
6441
++			expect: authorizer.DecisionDeny,
6442
++		},
6443
++		{
6444
++			name:   "denied: cross cluster node delete pod",
6445
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "delete", Resource: "pods", Name: "pod", Namespace: "ns"},
6446
++			expect: authorizer.DecisionDeny,
6447
++		},
6448
++		{
6449
++			name:   "denied: cross cluster node get node",
6450
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "get", Resource: "nodes", Name: "node"},
6451
++			expect: authorizer.DecisionDeny,
6452
++		},
6453
++		{
6454
++			name:   "denied: cross cluster node list nodes",
6455
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "list", Resource: "nodes"},
6456
++			expect: authorizer.DecisionDeny,
6457
++		},
6458
++		{
6459
++			name:   "denied: cross cluster node create nodes",
6460
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "node"},
6461
++			expect: authorizer.DecisionDeny,
6462
++		},
6463
++		{
6464
++			name:   "denied: cross cluster node update nodes",
6465
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "update", Resource: "nodes", Name: "node"},
6466
++			expect: authorizer.DecisionDeny,
6467
++		},
6468
++		{
6469
++			name:   "denied: cross cluster node delete nodes",
6470
++			attrs:  authorizer.AttributesRecord{User: crossClusterNode, ResourceRequest: true, Verb: "delete", Resource: "nodes", Name: "node"},
6471
++			expect: authorizer.DecisionDeny,
6472
++		},
6473
++
6474
++		// Deny requests from invalid node.
6475
++		{
6476
++			name:   "denied: invalid worker get pod",
6477
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "get", Resource: "pods", Name: "pod", Namespace: "ns"},
6478
++			expect: authorizer.DecisionDeny,
6479
++		},
6480
++		{
6481
++			name:   "denied: invalid worker list pod",
6482
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "list", Resource: "pods", Namespace: "ns"},
6483
++			expect: authorizer.DecisionDeny,
6484
++		},
6485
++		{
6486
++			name:   "denied: invalid worker create pod",
6487
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "create", Resource: "pods", Name: "pod", Namespace: "ns"},
6488
++			expect: authorizer.DecisionDeny,
6489
++		},
6490
++		{
6491
++			name:   "denied: invalid worker update pod",
6492
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "update", Resource: "pods", Name: "pod", Namespace: "ns"},
6493
++			expect: authorizer.DecisionDeny,
6494
++		},
6495
++		{
6496
++			name:   "denied: invalid worker delete pod",
6497
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "delete", Resource: "pods", Name: "pod", Namespace: "ns"},
6498
++			expect: authorizer.DecisionDeny,
6499
++		},
6500
++		{
6501
++			name:   "denied: invalid worker get node",
6502
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "get", Resource: "nodes", Name: "node"},
6503
++			expect: authorizer.DecisionDeny,
6504
++		},
6505
++		{
6506
++			name:   "denied: invalid worker list nodes",
6507
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "list", Resource: "nodes"},
6508
++			expect: authorizer.DecisionDeny,
6509
++		},
6510
++		{
6511
++			name:   "denied: invalid worker create nodes",
6512
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "node"},
6513
++			expect: authorizer.DecisionDeny,
6514
++		},
6515
++		{
6516
++			name:   "denied: invalid worker update nodes",
6517
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "update", Resource: "nodes", Name: "node"},
6518
++			expect: authorizer.DecisionDeny,
6519
++		},
6520
++		{
6521
++			name:   "denied: invalid worker delete nodes",
6522
++			attrs:  authorizer.AttributesRecord{User: invalidWorker, ResourceRequest: true, Verb: "delete", Resource: "nodes", Name: "node"},
6523
++			expect: authorizer.DecisionDeny,
6524
++		},
6525
++
6526
++		// Deny exec, run and attach operation on master nodes using proxy resource.
6527
++		{
6528
++			name:   "denied: attach using proxy resource on master",
6529
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "master-0", Path: masterProxyAttachPath},
6530
++			expect: authorizer.DecisionDeny,
6531
++		},
6532
++		{
6533
++			name:   "denied: exec using proxy resource on master",
6534
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "master-0", Path: masterProxyExecPath},
6535
++			expect: authorizer.DecisionDeny,
6536
++		},
6537
++		{
6538
++			name:   "denied: run using proxy resource on master",
6539
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "master-0", Path: masterProxyRunPath},
6540
++			expect: authorizer.DecisionDeny,
6541
++		},
6542
++
6543
++		// Do not deny exec, run and attach operation on worker nodes using proxy resource.
6544
++		{
6545
++			name:   "allowed: attach using proxy resource on worker",
6546
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "worker-0", Path: workerProxyAttachPath},
6547
++			expect: authorizer.DecisionNoOpinion,
6548
++		},
6549
++		{
6550
++			name:   "allowed: exec using proxy resource on worker",
6551
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "worker-0", Path: workerProxyExecPath},
6552
++			expect: authorizer.DecisionNoOpinion,
6553
++		},
6554
++		{
6555
++			name:   "allowed: run using proxy resource on worker",
6556
++			attrs:  authorizer.AttributesRecord{User: clusterNode, ResourceRequest: true, Verb: "create", Resource: "nodes", Name: "worker-0", Path: workerProxyRunPath},
6557
++			expect: authorizer.DecisionNoOpinion,
6558
++		},
6559
++	}
6560
++
6561
++	for _, tc := range tests {
6562
++		t.Run(tc.name, func(t *testing.T) {
6563
++			decision, _, _ := authz.Authorize(tc.attrs)
6564
++			if decision != tc.expect {
6565
++				t.Errorf("expected %v, got %v", tc.expect, decision)
6566
++			}
6567
++		})
6568
++	}
6569
++}
6570
+diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go
6571
+index b569ea8..0e44d4c 100644
6572
+--- a/staging/src/k8s.io/api/core/v1/generated.pb.go
6573
+@@ -35,6 +35,7 @@ limitations under the License.
6574
+ 		Binding
6575
+ 		CSIPersistentVolumeSource
6576
+ 		Capabilities
6577
++		CascadeDiskVolumeSource
6578
+ 		CephFSPersistentVolumeSource
6579
+ 		CephFSVolumeSource
6580
+ 		CinderPersistentVolumeSource
6581
+@@ -297,772 +298,777 @@ func (m *Capabilities) Reset()                    { *m = Capabilities{} }
6582
+ func (*Capabilities) ProtoMessage()               {}
6583
+ func (*Capabilities) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} }
6584
+ 
6585
++func (m *CascadeDiskVolumeSource) Reset()      { *m = CascadeDiskVolumeSource{} }
6586
++func (*CascadeDiskVolumeSource) ProtoMessage() {}
6587
++func (*CascadeDiskVolumeSource) Descriptor() ([]byte, []int) {
6588
++	return fileDescriptorGenerated, []int{10}
6589
++}
6590
++
6591
+ func (m *CephFSPersistentVolumeSource) Reset()      { *m = CephFSPersistentVolumeSource{} }
6592
+ func (*CephFSPersistentVolumeSource) ProtoMessage() {}
6593
+ func (*CephFSPersistentVolumeSource) Descriptor() ([]byte, []int) {
6594
+-	return fileDescriptorGenerated, []int{10}
6595
++	return fileDescriptorGenerated, []int{11}
6596
+ }
6597
+ 
6598
+ func (m *CephFSVolumeSource) Reset()                    { *m = CephFSVolumeSource{} }
6599
+ func (*CephFSVolumeSource) ProtoMessage()               {}
6600
+-func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} }
6601
++func (*CephFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{12} }
6602
+ 
6603
+ func (m *CinderPersistentVolumeSource) Reset()      { *m = CinderPersistentVolumeSource{} }
6604
+ func (*CinderPersistentVolumeSource) ProtoMessage() {}
6605
+ func (*CinderPersistentVolumeSource) Descriptor() ([]byte, []int) {
6606
+-	return fileDescriptorGenerated, []int{12}
6607
++	return fileDescriptorGenerated, []int{13}
6608
+ }
6609
+ 
6610
+ func (m *CinderVolumeSource) Reset()                    { *m = CinderVolumeSource{} }
6611
+ func (*CinderVolumeSource) ProtoMessage()               {}
6612
+-func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{13} }
6613
++func (*CinderVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} }
6614
+ 
6615
+ func (m *ClientIPConfig) Reset()                    { *m = ClientIPConfig{} }
6616
+ func (*ClientIPConfig) ProtoMessage()               {}
6617
+-func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{14} }
6618
++func (*ClientIPConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} }
6619
+ 
6620
+ func (m *ComponentCondition) Reset()                    { *m = ComponentCondition{} }
6621
+ func (*ComponentCondition) ProtoMessage()               {}
6622
+-func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{15} }
6623
++func (*ComponentCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} }
6624
+ 
6625
+ func (m *ComponentStatus) Reset()                    { *m = ComponentStatus{} }
6626
+ func (*ComponentStatus) ProtoMessage()               {}
6627
+-func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{16} }
6628
++func (*ComponentStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} }
6629
+ 
6630
+ func (m *ComponentStatusList) Reset()                    { *m = ComponentStatusList{} }
6631
+ func (*ComponentStatusList) ProtoMessage()               {}
6632
+-func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{17} }
6633
++func (*ComponentStatusList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} }
6634
+ 
6635
+ func (m *ConfigMap) Reset()                    { *m = ConfigMap{} }
6636
+ func (*ConfigMap) ProtoMessage()               {}
6637
+-func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{18} }
6638
++func (*ConfigMap) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} }
6639
+ 
6640
+ func (m *ConfigMapEnvSource) Reset()                    { *m = ConfigMapEnvSource{} }
6641
+ func (*ConfigMapEnvSource) ProtoMessage()               {}
6642
+-func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{19} }
6643
++func (*ConfigMapEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} }
6644
+ 
6645
+ func (m *ConfigMapKeySelector) Reset()                    { *m = ConfigMapKeySelector{} }
6646
+ func (*ConfigMapKeySelector) ProtoMessage()               {}
6647
+-func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} }
6648
++func (*ConfigMapKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} }
6649
+ 
6650
+ func (m *ConfigMapList) Reset()                    { *m = ConfigMapList{} }
6651
+ func (*ConfigMapList) ProtoMessage()               {}
6652
+-func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} }
6653
++func (*ConfigMapList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} }
6654
+ 
6655
+ func (m *ConfigMapNodeConfigSource) Reset()      { *m = ConfigMapNodeConfigSource{} }
6656
+ func (*ConfigMapNodeConfigSource) ProtoMessage() {}
6657
+ func (*ConfigMapNodeConfigSource) Descriptor() ([]byte, []int) {
6658
+-	return fileDescriptorGenerated, []int{22}
6659
++	return fileDescriptorGenerated, []int{23}
6660
+ }
6661
+ 
6662
+ func (m *ConfigMapProjection) Reset()                    { *m = ConfigMapProjection{} }
6663
+ func (*ConfigMapProjection) ProtoMessage()               {}
6664
+-func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} }
6665
++func (*ConfigMapProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} }
6666
+ 
6667
+ func (m *ConfigMapVolumeSource) Reset()                    { *m = ConfigMapVolumeSource{} }
6668
+ func (*ConfigMapVolumeSource) ProtoMessage()               {}
6669
+-func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} }
6670
++func (*ConfigMapVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} }
6671
+ 
6672
+ func (m *Container) Reset()                    { *m = Container{} }
6673
+ func (*Container) ProtoMessage()               {}
6674
+-func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} }
6675
++func (*Container) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} }
6676
+ 
6677
+ func (m *ContainerImage) Reset()                    { *m = ContainerImage{} }
6678
+ func (*ContainerImage) ProtoMessage()               {}
6679
+-func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} }
6680
++func (*ContainerImage) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} }
6681
+ 
6682
+ func (m *ContainerPort) Reset()                    { *m = ContainerPort{} }
6683
+ func (*ContainerPort) ProtoMessage()               {}
6684
+-func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} }
6685
++func (*ContainerPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} }
6686
+ 
6687
+ func (m *ContainerState) Reset()                    { *m = ContainerState{} }
6688
+ func (*ContainerState) ProtoMessage()               {}
6689
+-func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} }
6690
++func (*ContainerState) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} }
6691
+ 
6692
+ func (m *ContainerStateRunning) Reset()                    { *m = ContainerStateRunning{} }
6693
+ func (*ContainerStateRunning) ProtoMessage()               {}
6694
+-func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} }
6695
++func (*ContainerStateRunning) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} }
6696
+ 
6697
+ func (m *ContainerStateTerminated) Reset()      { *m = ContainerStateTerminated{} }
6698
+ func (*ContainerStateTerminated) ProtoMessage() {}
6699
+ func (*ContainerStateTerminated) Descriptor() ([]byte, []int) {
6700
+-	return fileDescriptorGenerated, []int{30}
6701
++	return fileDescriptorGenerated, []int{31}
6702
+ }
6703
+ 
6704
+ func (m *ContainerStateWaiting) Reset()                    { *m = ContainerStateWaiting{} }
6705
+ func (*ContainerStateWaiting) ProtoMessage()               {}
6706
+-func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} }
6707
++func (*ContainerStateWaiting) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} }
6708
+ 
6709
+ func (m *ContainerStatus) Reset()                    { *m = ContainerStatus{} }
6710
+ func (*ContainerStatus) ProtoMessage()               {}
6711
+-func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} }
6712
++func (*ContainerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} }
6713
+ 
6714
+ func (m *DaemonEndpoint) Reset()                    { *m = DaemonEndpoint{} }
6715
+ func (*DaemonEndpoint) ProtoMessage()               {}
6716
+-func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} }
6717
++func (*DaemonEndpoint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} }
6718
+ 
6719
+ func (m *DownwardAPIProjection) Reset()                    { *m = DownwardAPIProjection{} }
6720
+ func (*DownwardAPIProjection) ProtoMessage()               {}
6721
+-func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} }
6722
++func (*DownwardAPIProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} }
6723
+ 
6724
+ func (m *DownwardAPIVolumeFile) Reset()                    { *m = DownwardAPIVolumeFile{} }
6725
+ func (*DownwardAPIVolumeFile) ProtoMessage()               {}
6726
+-func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{35} }
6727
++func (*DownwardAPIVolumeFile) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{36} }
6728
+ 
6729
+ func (m *DownwardAPIVolumeSource) Reset()      { *m = DownwardAPIVolumeSource{} }
6730
+ func (*DownwardAPIVolumeSource) ProtoMessage() {}
6731
+ func (*DownwardAPIVolumeSource) Descriptor() ([]byte, []int) {
6732
+-	return fileDescriptorGenerated, []int{36}
6733
++	return fileDescriptorGenerated, []int{37}
6734
+ }
6735
+ 
6736
+ func (m *EmptyDirVolumeSource) Reset()                    { *m = EmptyDirVolumeSource{} }
6737
+ func (*EmptyDirVolumeSource) ProtoMessage()               {}
6738
+-func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{37} }
6739
++func (*EmptyDirVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} }
6740
+ 
6741
+ func (m *EndpointAddress) Reset()                    { *m = EndpointAddress{} }
6742
+ func (*EndpointAddress) ProtoMessage()               {}
6743
+-func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{38} }
6744
++func (*EndpointAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} }
6745
+ 
6746
+ func (m *EndpointPort) Reset()                    { *m = EndpointPort{} }
6747
+ func (*EndpointPort) ProtoMessage()               {}
6748
+-func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{39} }
6749
++func (*EndpointPort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} }
6750
+ 
6751
+ func (m *EndpointSubset) Reset()                    { *m = EndpointSubset{} }
6752
+ func (*EndpointSubset) ProtoMessage()               {}
6753
+-func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{40} }
6754
++func (*EndpointSubset) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} }
6755
+ 
6756
+ func (m *Endpoints) Reset()                    { *m = Endpoints{} }
6757
+ func (*Endpoints) ProtoMessage()               {}
6758
+-func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{41} }
6759
++func (*Endpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} }
6760
+ 
6761
+ func (m *EndpointsList) Reset()                    { *m = EndpointsList{} }
6762
+ func (*EndpointsList) ProtoMessage()               {}
6763
+-func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{42} }
6764
++func (*EndpointsList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} }
6765
+ 
6766
+ func (m *EnvFromSource) Reset()                    { *m = EnvFromSource{} }
6767
+ func (*EnvFromSource) ProtoMessage()               {}
6768
+-func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{43} }
6769
++func (*EnvFromSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} }
6770
+ 
6771
+ func (m *EnvVar) Reset()                    { *m = EnvVar{} }
6772
+ func (*EnvVar) ProtoMessage()               {}
6773
+-func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{44} }
6774
++func (*EnvVar) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} }
6775
+ 
6776
+ func (m *EnvVarSource) Reset()                    { *m = EnvVarSource{} }
6777
+ func (*EnvVarSource) ProtoMessage()               {}
6778
+-func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{45} }
6779
++func (*EnvVarSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} }
6780
+ 
6781
+ func (m *Event) Reset()                    { *m = Event{} }
6782
+ func (*Event) ProtoMessage()               {}
6783
+-func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{46} }
6784
++func (*Event) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} }
6785
+ 
6786
+ func (m *EventList) Reset()                    { *m = EventList{} }
6787
+ func (*EventList) ProtoMessage()               {}
6788
+-func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{47} }
6789
++func (*EventList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} }
6790
+ 
6791
+ func (m *EventSeries) Reset()                    { *m = EventSeries{} }
6792
+ func (*EventSeries) ProtoMessage()               {}
6793
+-func (*EventSeries) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{48} }
6794
++func (*EventSeries) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} }
6795
+ 
6796
+ func (m *EventSource) Reset()                    { *m = EventSource{} }
6797
+ func (*EventSource) ProtoMessage()               {}
6798
+-func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{49} }
6799
++func (*EventSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} }
6800
+ 
6801
+ func (m *ExecAction) Reset()                    { *m = ExecAction{} }
6802
+ func (*ExecAction) ProtoMessage()               {}
6803
+-func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{50} }
6804
++func (*ExecAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} }
6805
+ 
6806
+ func (m *FCVolumeSource) Reset()                    { *m = FCVolumeSource{} }
6807
+ func (*FCVolumeSource) ProtoMessage()               {}
6808
+-func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{51} }
6809
++func (*FCVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{52} }
6810
+ 
6811
+ func (m *FlexPersistentVolumeSource) Reset()      { *m = FlexPersistentVolumeSource{} }
6812
+ func (*FlexPersistentVolumeSource) ProtoMessage() {}
6813
+ func (*FlexPersistentVolumeSource) Descriptor() ([]byte, []int) {
6814
+-	return fileDescriptorGenerated, []int{52}
6815
++	return fileDescriptorGenerated, []int{53}
6816
+ }
6817
+ 
6818
+ func (m *FlexVolumeSource) Reset()                    { *m = FlexVolumeSource{} }
6819
+ func (*FlexVolumeSource) ProtoMessage()               {}
6820
+-func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{53} }
6821
++func (*FlexVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} }
6822
+ 
6823
+ func (m *FlockerVolumeSource) Reset()                    { *m = FlockerVolumeSource{} }
6824
+ func (*FlockerVolumeSource) ProtoMessage()               {}
6825
+-func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{54} }
6826
++func (*FlockerVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{55} }
6827
+ 
6828
+ func (m *GCEPersistentDiskVolumeSource) Reset()      { *m = GCEPersistentDiskVolumeSource{} }
6829
+ func (*GCEPersistentDiskVolumeSource) ProtoMessage() {}
6830
+ func (*GCEPersistentDiskVolumeSource) Descriptor() ([]byte, []int) {
6831
+-	return fileDescriptorGenerated, []int{55}
6832
++	return fileDescriptorGenerated, []int{56}
6833
+ }
6834
+ 
6835
+ func (m *GitRepoVolumeSource) Reset()                    { *m = GitRepoVolumeSource{} }
6836
+ func (*GitRepoVolumeSource) ProtoMessage()               {}
6837
+-func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{56} }
6838
++func (*GitRepoVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} }
6839
+ 
6840
+ func (m *GlusterfsVolumeSource) Reset()                    { *m = GlusterfsVolumeSource{} }
6841
+ func (*GlusterfsVolumeSource) ProtoMessage()               {}
6842
+-func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{57} }
6843
++func (*GlusterfsVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} }
6844
+ 
6845
+ func (m *HTTPGetAction) Reset()                    { *m = HTTPGetAction{} }
6846
+ func (*HTTPGetAction) ProtoMessage()               {}
6847
+-func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{58} }
6848
++func (*HTTPGetAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} }
6849
+ 
6850
+ func (m *HTTPHeader) Reset()                    { *m = HTTPHeader{} }
6851
+ func (*HTTPHeader) ProtoMessage()               {}
6852
+-func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{59} }
6853
++func (*HTTPHeader) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} }
6854
+ 
6855
+ func (m *Handler) Reset()                    { *m = Handler{} }
6856
+ func (*Handler) ProtoMessage()               {}
6857
+-func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{60} }
6858
++func (*Handler) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} }
6859
+ 
6860
+ func (m *HostAlias) Reset()                    { *m = HostAlias{} }
6861
+ func (*HostAlias) ProtoMessage()               {}
6862
+-func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{61} }
6863
++func (*HostAlias) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} }
6864
+ 
6865
+ func (m *HostPathVolumeSource) Reset()                    { *m = HostPathVolumeSource{} }
6866
+ func (*HostPathVolumeSource) ProtoMessage()               {}
6867
+-func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{62} }
6868
++func (*HostPathVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{63} }
6869
+ 
6870
+ func (m *ISCSIPersistentVolumeSource) Reset()      { *m = ISCSIPersistentVolumeSource{} }
6871
+ func (*ISCSIPersistentVolumeSource) ProtoMessage() {}
6872
+ func (*ISCSIPersistentVolumeSource) Descriptor() ([]byte, []int) {
6873
+-	return fileDescriptorGenerated, []int{63}
6874
++	return fileDescriptorGenerated, []int{64}
6875
+ }
6876
+ 
6877
+ func (m *ISCSIVolumeSource) Reset()                    { *m = ISCSIVolumeSource{} }
6878
+ func (*ISCSIVolumeSource) ProtoMessage()               {}
6879
+-func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{64} }
6880
++func (*ISCSIVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} }
6881
+ 
6882
+ func (m *KeyToPath) Reset()                    { *m = KeyToPath{} }
6883
+ func (*KeyToPath) ProtoMessage()               {}
6884
+-func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{65} }
6885
++func (*KeyToPath) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} }
6886
+ 
6887
+ func (m *Lifecycle) Reset()                    { *m = Lifecycle{} }
6888
+ func (*Lifecycle) ProtoMessage()               {}
6889
+-func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{66} }
6890
++func (*Lifecycle) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} }
6891
+ 
6892
+ func (m *LimitRange) Reset()                    { *m = LimitRange{} }
6893
+ func (*LimitRange) ProtoMessage()               {}
6894
+-func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{67} }
6895
++func (*LimitRange) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} }
6896
+ 
6897
+ func (m *LimitRangeItem) Reset()                    { *m = LimitRangeItem{} }
6898
+ func (*LimitRangeItem) ProtoMessage()               {}
6899
+-func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{68} }
6900
++func (*LimitRangeItem) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} }
6901
+ 
6902
+ func (m *LimitRangeList) Reset()                    { *m = LimitRangeList{} }
6903
+ func (*LimitRangeList) ProtoMessage()               {}
6904
+-func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{69} }
6905
++func (*LimitRangeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} }
6906
+ 
6907
+ func (m *LimitRangeSpec) Reset()                    { *m = LimitRangeSpec{} }
6908
+ func (*LimitRangeSpec) ProtoMessage()               {}
6909
+-func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{70} }
6910
++func (*LimitRangeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} }
6911
+ 
6912
+ func (m *List) Reset()                    { *m = List{} }
6913
+ func (*List) ProtoMessage()               {}
6914
+-func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{71} }
6915
++func (*List) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} }
6916
+ 
6917
+ func (m *LoadBalancerIngress) Reset()                    { *m = LoadBalancerIngress{} }
6918
+ func (*LoadBalancerIngress) ProtoMessage()               {}
6919
+-func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{72} }
6920
++func (*LoadBalancerIngress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} }
6921
+ 
6922
+ func (m *LoadBalancerStatus) Reset()                    { *m = LoadBalancerStatus{} }
6923
+ func (*LoadBalancerStatus) ProtoMessage()               {}
6924
+-func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{73} }
6925
++func (*LoadBalancerStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} }
6926
+ 
6927
+ func (m *LocalObjectReference) Reset()                    { *m = LocalObjectReference{} }
6928
+ func (*LocalObjectReference) ProtoMessage()               {}
6929
+-func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{74} }
6930
++func (*LocalObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} }
6931
+ 
6932
+ func (m *LocalVolumeSource) Reset()                    { *m = LocalVolumeSource{} }
6933
+ func (*LocalVolumeSource) ProtoMessage()               {}
6934
+-func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{75} }
6935
++func (*LocalVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} }
6936
+ 
6937
+ func (m *NFSVolumeSource) Reset()                    { *m = NFSVolumeSource{} }
6938
+ func (*NFSVolumeSource) ProtoMessage()               {}
6939
+-func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{76} }
6940
++func (*NFSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} }
6941
+ 
6942
+ func (m *Namespace) Reset()                    { *m = Namespace{} }
6943
+ func (*Namespace) ProtoMessage()               {}
6944
+-func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{77} }
6945
++func (*Namespace) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} }
6946
+ 
6947
+ func (m *NamespaceList) Reset()                    { *m = NamespaceList{} }
6948
+ func (*NamespaceList) ProtoMessage()               {}
6949
+-func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{78} }
6950
++func (*NamespaceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} }
6951
+ 
6952
+ func (m *NamespaceSpec) Reset()                    { *m = NamespaceSpec{} }
6953
+ func (*NamespaceSpec) ProtoMessage()               {}
6954
+-func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{79} }
6955
++func (*NamespaceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} }
6956
+ 
6957
+ func (m *NamespaceStatus) Reset()                    { *m = NamespaceStatus{} }
6958
+ func (*NamespaceStatus) ProtoMessage()               {}
6959
+-func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{80} }
6960
++func (*NamespaceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} }
6961
+ 
6962
+ func (m *Node) Reset()                    { *m = Node{} }
6963
+ func (*Node) ProtoMessage()               {}
6964
+-func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{81} }
6965
++func (*Node) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} }
6966
+ 
6967
+ func (m *NodeAddress) Reset()                    { *m = NodeAddress{} }
6968
+ func (*NodeAddress) ProtoMessage()               {}
6969
+-func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{82} }
6970
++func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} }
6971
+ 
6972
+ func (m *NodeAffinity) Reset()                    { *m = NodeAffinity{} }
6973
+ func (*NodeAffinity) ProtoMessage()               {}
6974
+-func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{83} }
6975
++func (*NodeAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} }
6976
+ 
6977
+ func (m *NodeCondition) Reset()                    { *m = NodeCondition{} }
6978
+ func (*NodeCondition) ProtoMessage()               {}
6979
+-func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{84} }
6980
++func (*NodeCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} }
6981
+ 
6982
+ func (m *NodeConfigSource) Reset()                    { *m = NodeConfigSource{} }
6983
+ func (*NodeConfigSource) ProtoMessage()               {}
6984
+-func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{85} }
6985
++func (*NodeConfigSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} }
6986
+ 
6987
+ func (m *NodeConfigStatus) Reset()                    { *m = NodeConfigStatus{} }
6988
+ func (*NodeConfigStatus) ProtoMessage()               {}
6989
+-func (*NodeConfigStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{86} }
6990
++func (*NodeConfigStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} }
6991
+ 
6992
+ func (m *NodeDaemonEndpoints) Reset()                    { *m = NodeDaemonEndpoints{} }
6993
+ func (*NodeDaemonEndpoints) ProtoMessage()               {}
6994
+-func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{87} }
6995
++func (*NodeDaemonEndpoints) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} }
6996
+ 
6997
+ func (m *NodeList) Reset()                    { *m = NodeList{} }
6998
+ func (*NodeList) ProtoMessage()               {}
6999
+-func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{88} }
7000
++func (*NodeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} }
7001
+ 
7002
+ func (m *NodeProxyOptions) Reset()                    { *m = NodeProxyOptions{} }
7003
+ func (*NodeProxyOptions) ProtoMessage()               {}
7004
+-func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{89} }
7005
++func (*NodeProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} }
7006
+ 
7007
+ func (m *NodeResources) Reset()                    { *m = NodeResources{} }
7008
+ func (*NodeResources) ProtoMessage()               {}
7009
+-func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{90} }
7010
++func (*NodeResources) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} }
7011
+ 
7012
+ func (m *NodeSelector) Reset()                    { *m = NodeSelector{} }
7013
+ func (*NodeSelector) ProtoMessage()               {}
7014
+-func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{91} }
7015
++func (*NodeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{92} }
7016
+ 
7017
+ func (m *NodeSelectorRequirement) Reset()      { *m = NodeSelectorRequirement{} }
7018
+ func (*NodeSelectorRequirement) ProtoMessage() {}
7019
+ func (*NodeSelectorRequirement) Descriptor() ([]byte, []int) {
7020
+-	return fileDescriptorGenerated, []int{92}
7021
++	return fileDescriptorGenerated, []int{93}
7022
+ }
7023
+ 
7024
+ func (m *NodeSelectorTerm) Reset()                    { *m = NodeSelectorTerm{} }
7025
+ func (*NodeSelectorTerm) ProtoMessage()               {}
7026
+-func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{93} }
7027
++func (*NodeSelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} }
7028
+ 
7029
+ func (m *NodeSpec) Reset()                    { *m = NodeSpec{} }
7030
+ func (*NodeSpec) ProtoMessage()               {}
7031
+-func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{94} }
7032
++func (*NodeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} }
7033
+ 
7034
+ func (m *NodeStatus) Reset()                    { *m = NodeStatus{} }
7035
+ func (*NodeStatus) ProtoMessage()               {}
7036
+-func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{95} }
7037
++func (*NodeStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} }
7038
+ 
7039
+ func (m *NodeSystemInfo) Reset()                    { *m = NodeSystemInfo{} }
7040
+ func (*NodeSystemInfo) ProtoMessage()               {}
7041
+-func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{96} }
7042
++func (*NodeSystemInfo) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} }
7043
+ 
7044
+ func (m *ObjectFieldSelector) Reset()                    { *m = ObjectFieldSelector{} }
7045
+ func (*ObjectFieldSelector) ProtoMessage()               {}
7046
+-func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{97} }
7047
++func (*ObjectFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} }
7048
+ 
7049
+ func (m *ObjectReference) Reset()                    { *m = ObjectReference{} }
7050
+ func (*ObjectReference) ProtoMessage()               {}
7051
+-func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{98} }
7052
++func (*ObjectReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} }
7053
+ 
7054
+ func (m *PersistentVolume) Reset()                    { *m = PersistentVolume{} }
7055
+ func (*PersistentVolume) ProtoMessage()               {}
7056
+-func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{99} }
7057
++func (*PersistentVolume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} }
7058
+ 
7059
+ func (m *PersistentVolumeClaim) Reset()                    { *m = PersistentVolumeClaim{} }
7060
+ func (*PersistentVolumeClaim) ProtoMessage()               {}
7061
+-func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{100} }
7062
++func (*PersistentVolumeClaim) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{101} }
7063
+ 
7064
+ func (m *PersistentVolumeClaimCondition) Reset()      { *m = PersistentVolumeClaimCondition{} }
7065
+ func (*PersistentVolumeClaimCondition) ProtoMessage() {}
7066
+ func (*PersistentVolumeClaimCondition) Descriptor() ([]byte, []int) {
7067
+-	return fileDescriptorGenerated, []int{101}
7068
++	return fileDescriptorGenerated, []int{102}
7069
+ }
7070
+ 
7071
+ func (m *PersistentVolumeClaimList) Reset()      { *m = PersistentVolumeClaimList{} }
7072
+ func (*PersistentVolumeClaimList) ProtoMessage() {}
7073
+ func (*PersistentVolumeClaimList) Descriptor() ([]byte, []int) {
7074
+-	return fileDescriptorGenerated, []int{102}
7075
++	return fileDescriptorGenerated, []int{103}
7076
+ }
7077
+ 
7078
+ func (m *PersistentVolumeClaimSpec) Reset()      { *m = PersistentVolumeClaimSpec{} }
7079
+ func (*PersistentVolumeClaimSpec) ProtoMessage() {}
7080
+ func (*PersistentVolumeClaimSpec) Descriptor() ([]byte, []int) {
7081
+-	return fileDescriptorGenerated, []int{103}
7082
++	return fileDescriptorGenerated, []int{104}
7083
+ }
7084
+ 
7085
+ func (m *PersistentVolumeClaimStatus) Reset()      { *m = PersistentVolumeClaimStatus{} }
7086
+ func (*PersistentVolumeClaimStatus) ProtoMessage() {}
7087
+ func (*PersistentVolumeClaimStatus) Descriptor() ([]byte, []int) {
7088
+-	return fileDescriptorGenerated, []int{104}
7089
++	return fileDescriptorGenerated, []int{105}
7090
+ }
7091
+ 
7092
+ func (m *PersistentVolumeClaimVolumeSource) Reset()      { *m = PersistentVolumeClaimVolumeSource{} }
7093
+ func (*PersistentVolumeClaimVolumeSource) ProtoMessage() {}
7094
+ func (*PersistentVolumeClaimVolumeSource) Descriptor() ([]byte, []int) {
7095
+-	return fileDescriptorGenerated, []int{105}
7096
++	return fileDescriptorGenerated, []int{106}
7097
+ }
7098
+ 
7099
+ func (m *PersistentVolumeList) Reset()                    { *m = PersistentVolumeList{} }
7100
+ func (*PersistentVolumeList) ProtoMessage()               {}
7101
+-func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{106} }
7102
++func (*PersistentVolumeList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{107} }
7103
+ 
7104
+ func (m *PersistentVolumeSource) Reset()      { *m = PersistentVolumeSource{} }
7105
+ func (*PersistentVolumeSource) ProtoMessage() {}
7106
+ func (*PersistentVolumeSource) Descriptor() ([]byte, []int) {
7107
+-	return fileDescriptorGenerated, []int{107}
7108
++	return fileDescriptorGenerated, []int{108}
7109
+ }
7110
+ 
7111
+ func (m *PersistentVolumeSpec) Reset()                    { *m = PersistentVolumeSpec{} }
7112
+ func (*PersistentVolumeSpec) ProtoMessage()               {}
7113
+-func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{108} }
7114
++func (*PersistentVolumeSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{109} }
7115
+ 
7116
+ func (m *PersistentVolumeStatus) Reset()      { *m = PersistentVolumeStatus{} }
7117
+ func (*PersistentVolumeStatus) ProtoMessage() {}
7118
+ func (*PersistentVolumeStatus) Descriptor() ([]byte, []int) {
7119
+-	return fileDescriptorGenerated, []int{109}
7120
++	return fileDescriptorGenerated, []int{110}
7121
+ }
7122
+ 
7123
+ func (m *PhotonPersistentDiskVolumeSource) Reset()      { *m = PhotonPersistentDiskVolumeSource{} }
7124
+ func (*PhotonPersistentDiskVolumeSource) ProtoMessage() {}
7125
+ func (*PhotonPersistentDiskVolumeSource) Descriptor() ([]byte, []int) {
7126
+-	return fileDescriptorGenerated, []int{110}
7127
++	return fileDescriptorGenerated, []int{111}
7128
+ }
7129
+ 
7130
+ func (m *Pod) Reset()                    { *m = Pod{} }
7131
+ func (*Pod) ProtoMessage()               {}
7132
+-func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{111} }
7133
++func (*Pod) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} }
7134
+ 
7135
+ func (m *PodAffinity) Reset()                    { *m = PodAffinity{} }
7136
+ func (*PodAffinity) ProtoMessage()               {}
7137
+-func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{112} }
7138
++func (*PodAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} }
7139
+ 
7140
+ func (m *PodAffinityTerm) Reset()                    { *m = PodAffinityTerm{} }
7141
+ func (*PodAffinityTerm) ProtoMessage()               {}
7142
+-func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{113} }
7143
++func (*PodAffinityTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} }
7144
+ 
7145
+ func (m *PodAntiAffinity) Reset()                    { *m = PodAntiAffinity{} }
7146
+ func (*PodAntiAffinity) ProtoMessage()               {}
7147
+-func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{114} }
7148
++func (*PodAntiAffinity) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} }
7149
+ 
7150
+ func (m *PodAttachOptions) Reset()                    { *m = PodAttachOptions{} }
7151
+ func (*PodAttachOptions) ProtoMessage()               {}
7152
+-func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{115} }
7153
++func (*PodAttachOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} }
7154
+ 
7155
+ func (m *PodCondition) Reset()                    { *m = PodCondition{} }
7156
+ func (*PodCondition) ProtoMessage()               {}
7157
+-func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{116} }
7158
++func (*PodCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} }
7159
+ 
7160
+ func (m *PodDNSConfig) Reset()                    { *m = PodDNSConfig{} }
7161
+ func (*PodDNSConfig) ProtoMessage()               {}
7162
+-func (*PodDNSConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{117} }
7163
++func (*PodDNSConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} }
7164
+ 
7165
+ func (m *PodDNSConfigOption) Reset()                    { *m = PodDNSConfigOption{} }
7166
+ func (*PodDNSConfigOption) ProtoMessage()               {}
7167
+-func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{118} }
7168
++func (*PodDNSConfigOption) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} }
7169
+ 
7170
+ func (m *PodExecOptions) Reset()                    { *m = PodExecOptions{} }
7171
+ func (*PodExecOptions) ProtoMessage()               {}
7172
+-func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{119} }
7173
++func (*PodExecOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} }
7174
+ 
7175
+ func (m *PodList) Reset()                    { *m = PodList{} }
7176
+ func (*PodList) ProtoMessage()               {}
7177
+-func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{120} }
7178
++func (*PodList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} }
7179
+ 
7180
+ func (m *PodLogOptions) Reset()                    { *m = PodLogOptions{} }
7181
+ func (*PodLogOptions) ProtoMessage()               {}
7182
+-func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{121} }
7183
++func (*PodLogOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} }
7184
+ 
7185
+ func (m *PodPortForwardOptions) Reset()                    { *m = PodPortForwardOptions{} }
7186
+ func (*PodPortForwardOptions) ProtoMessage()               {}
7187
+-func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{122} }
7188
++func (*PodPortForwardOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} }
7189
+ 
7190
+ func (m *PodProxyOptions) Reset()                    { *m = PodProxyOptions{} }
7191
+ func (*PodProxyOptions) ProtoMessage()               {}
7192
+-func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{123} }
7193
++func (*PodProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} }
7194
+ 
7195
+ func (m *PodReadinessGate) Reset()                    { *m = PodReadinessGate{} }
7196
+ func (*PodReadinessGate) ProtoMessage()               {}
7197
+-func (*PodReadinessGate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{124} }
7198
++func (*PodReadinessGate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} }
7199
+ 
7200
+ func (m *PodSecurityContext) Reset()                    { *m = PodSecurityContext{} }
7201
+ func (*PodSecurityContext) ProtoMessage()               {}
7202
+-func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{125} }
7203
++func (*PodSecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} }
7204
+ 
7205
+ func (m *PodSignature) Reset()                    { *m = PodSignature{} }
7206
+ func (*PodSignature) ProtoMessage()               {}
7207
+-func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} }
7208
++func (*PodSignature) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} }
7209
+ 
7210
+ func (m *PodSpec) Reset()                    { *m = PodSpec{} }
7211
+ func (*PodSpec) ProtoMessage()               {}
7212
+-func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} }
7213
++func (*PodSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} }
7214
+ 
7215
+ func (m *PodStatus) Reset()                    { *m = PodStatus{} }
7216
+ func (*PodStatus) ProtoMessage()               {}
7217
+-func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} }
7218
++func (*PodStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} }
7219
+ 
7220
+ func (m *PodStatusResult) Reset()                    { *m = PodStatusResult{} }
7221
+ func (*PodStatusResult) ProtoMessage()               {}
7222
+-func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} }
7223
++func (*PodStatusResult) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} }
7224
+ 
7225
+ func (m *PodTemplate) Reset()                    { *m = PodTemplate{} }
7226
+ func (*PodTemplate) ProtoMessage()               {}
7227
+-func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} }
7228
++func (*PodTemplate) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} }
7229
+ 
7230
+ func (m *PodTemplateList) Reset()                    { *m = PodTemplateList{} }
7231
+ func (*PodTemplateList) ProtoMessage()               {}
7232
+-func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} }
7233
++func (*PodTemplateList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} }
7234
+ 
7235
+ func (m *PodTemplateSpec) Reset()                    { *m = PodTemplateSpec{} }
7236
+ func (*PodTemplateSpec) ProtoMessage()               {}
7237
+-func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{132} }
7238
++func (*PodTemplateSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} }
7239
+ 
7240
+ func (m *PortworxVolumeSource) Reset()                    { *m = PortworxVolumeSource{} }
7241
+ func (*PortworxVolumeSource) ProtoMessage()               {}
7242
+-func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{133} }
7243
++func (*PortworxVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} }
7244
+ 
7245
+ func (m *Preconditions) Reset()                    { *m = Preconditions{} }
7246
+ func (*Preconditions) ProtoMessage()               {}
7247
+-func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{134} }
7248
++func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} }
7249
+ 
7250
+ func (m *PreferAvoidPodsEntry) Reset()                    { *m = PreferAvoidPodsEntry{} }
7251
+ func (*PreferAvoidPodsEntry) ProtoMessage()               {}
7252
+-func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} }
7253
++func (*PreferAvoidPodsEntry) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} }
7254
+ 
7255
+ func (m *PreferredSchedulingTerm) Reset()      { *m = PreferredSchedulingTerm{} }
7256
+ func (*PreferredSchedulingTerm) ProtoMessage() {}
7257
+ func (*PreferredSchedulingTerm) Descriptor() ([]byte, []int) {
7258
+-	return fileDescriptorGenerated, []int{136}
7259
++	return fileDescriptorGenerated, []int{137}
7260
+ }
7261
+ 
7262
+ func (m *Probe) Reset()                    { *m = Probe{} }
7263
+ func (*Probe) ProtoMessage()               {}
7264
+-func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} }
7265
++func (*Probe) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} }
7266
+ 
7267
+ func (m *ProjectedVolumeSource) Reset()                    { *m = ProjectedVolumeSource{} }
7268
+ func (*ProjectedVolumeSource) ProtoMessage()               {}
7269
+-func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} }
7270
++func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} }
7271
+ 
7272
+ func (m *QuobyteVolumeSource) Reset()                    { *m = QuobyteVolumeSource{} }
7273
+ func (*QuobyteVolumeSource) ProtoMessage()               {}
7274
+-func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} }
7275
++func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} }
7276
+ 
7277
+ func (m *RBDPersistentVolumeSource) Reset()      { *m = RBDPersistentVolumeSource{} }
7278
+ func (*RBDPersistentVolumeSource) ProtoMessage() {}
7279
+ func (*RBDPersistentVolumeSource) Descriptor() ([]byte, []int) {
7280
+-	return fileDescriptorGenerated, []int{140}
7281
++	return fileDescriptorGenerated, []int{141}
7282
+ }
7283
+ 
7284
+ func (m *RBDVolumeSource) Reset()                    { *m = RBDVolumeSource{} }
7285
+ func (*RBDVolumeSource) ProtoMessage()               {}
7286
+-func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} }
7287
++func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} }
7288
+ 
7289
+ func (m *RangeAllocation) Reset()                    { *m = RangeAllocation{} }
7290
+ func (*RangeAllocation) ProtoMessage()               {}
7291
+-func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} }
7292
++func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} }
7293
+ 
7294
+ func (m *ReplicationController) Reset()                    { *m = ReplicationController{} }
7295
+ func (*ReplicationController) ProtoMessage()               {}
7296
+-func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} }
7297
++func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} }
7298
+ 
7299
+ func (m *ReplicationControllerCondition) Reset()      { *m = ReplicationControllerCondition{} }
7300
+ func (*ReplicationControllerCondition) ProtoMessage() {}
7301
+ func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) {
7302
+-	return fileDescriptorGenerated, []int{144}
7303
++	return fileDescriptorGenerated, []int{145}
7304
+ }
7305
+ 
7306
+ func (m *ReplicationControllerList) Reset()      { *m = ReplicationControllerList{} }
7307
+ func (*ReplicationControllerList) ProtoMessage() {}
7308
+ func (*ReplicationControllerList) Descriptor() ([]byte, []int) {
7309
+-	return fileDescriptorGenerated, []int{145}
7310
++	return fileDescriptorGenerated, []int{146}
7311
+ }
7312
+ 
7313
+ func (m *ReplicationControllerSpec) Reset()      { *m = ReplicationControllerSpec{} }
7314
+ func (*ReplicationControllerSpec) ProtoMessage() {}
7315
+ func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) {
7316
+-	return fileDescriptorGenerated, []int{146}
7317
++	return fileDescriptorGenerated, []int{147}
7318
+ }
7319
+ 
7320
+ func (m *ReplicationControllerStatus) Reset()      { *m = ReplicationControllerStatus{} }
7321
+ func (*ReplicationControllerStatus) ProtoMessage() {}
7322
+ func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) {
7323
+-	return fileDescriptorGenerated, []int{147}
7324
++	return fileDescriptorGenerated, []int{148}
7325
+ }
7326
+ 
7327
+ func (m *ResourceFieldSelector) Reset()                    { *m = ResourceFieldSelector{} }
7328
+ func (*ResourceFieldSelector) ProtoMessage()               {}
7329
+-func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} }
7330
++func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} }
7331
+ 
7332
+ func (m *ResourceQuota) Reset()                    { *m = ResourceQuota{} }
7333
+ func (*ResourceQuota) ProtoMessage()               {}
7334
+-func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} }
7335
++func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} }
7336
+ 
7337
+ func (m *ResourceQuotaList) Reset()                    { *m = ResourceQuotaList{} }
7338
+ func (*ResourceQuotaList) ProtoMessage()               {}
7339
+-func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} }
7340
++func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} }
7341
+ 
7342
+ func (m *ResourceQuotaSpec) Reset()                    { *m = ResourceQuotaSpec{} }
7343
+ func (*ResourceQuotaSpec) ProtoMessage()               {}
7344
+-func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} }
7345
++func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} }
7346
+ 
7347
+ func (m *ResourceQuotaStatus) Reset()                    { *m = ResourceQuotaStatus{} }
7348
+ func (*ResourceQuotaStatus) ProtoMessage()               {}
7349
+-func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} }
7350
++func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} }
7351
+ 
7352
+ func (m *ResourceRequirements) Reset()                    { *m = ResourceRequirements{} }
7353
+ func (*ResourceRequirements) ProtoMessage()               {}
7354
+-func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} }
7355
++func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} }
7356
+ 
7357
+ func (m *SELinuxOptions) Reset()                    { *m = SELinuxOptions{} }
7358
+ func (*SELinuxOptions) ProtoMessage()               {}
7359
+-func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} }
7360
++func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} }
7361
+ 
7362
+ func (m *ScaleIOPersistentVolumeSource) Reset()      { *m = ScaleIOPersistentVolumeSource{} }
7363
+ func (*ScaleIOPersistentVolumeSource) ProtoMessage() {}
7364
+ func (*ScaleIOPersistentVolumeSource) Descriptor() ([]byte, []int) {
7365
+-	return fileDescriptorGenerated, []int{155}
7366
++	return fileDescriptorGenerated, []int{156}
7367
+ }
7368
+ 
7369
+ func (m *ScaleIOVolumeSource) Reset()                    { *m = ScaleIOVolumeSource{} }
7370
+ func (*ScaleIOVolumeSource) ProtoMessage()               {}
7371
+-func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} }
7372
++func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} }
7373
+ 
7374
+ func (m *ScopeSelector) Reset()                    { *m = ScopeSelector{} }
7375
+ func (*ScopeSelector) ProtoMessage()               {}
7376
+-func (*ScopeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} }
7377
++func (*ScopeSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} }
7378
+ 
7379
+ func (m *ScopedResourceSelectorRequirement) Reset()      { *m = ScopedResourceSelectorRequirement{} }
7380
+ func (*ScopedResourceSelectorRequirement) ProtoMessage() {}
7381
+ func (*ScopedResourceSelectorRequirement) Descriptor() ([]byte, []int) {
7382
+-	return fileDescriptorGenerated, []int{158}
7383
++	return fileDescriptorGenerated, []int{159}
7384
+ }
7385
+ 
7386
+ func (m *Secret) Reset()                    { *m = Secret{} }
7387
+ func (*Secret) ProtoMessage()               {}
7388
+-func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} }
7389
++func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} }
7390
+ 
7391
+ func (m *SecretEnvSource) Reset()                    { *m = SecretEnvSource{} }
7392
+ func (*SecretEnvSource) ProtoMessage()               {}
7393
+-func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} }
7394
++func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} }
7395
+ 
7396
+ func (m *SecretKeySelector) Reset()                    { *m = SecretKeySelector{} }
7397
+ func (*SecretKeySelector) ProtoMessage()               {}
7398
+-func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} }
7399
++func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} }
7400
+ 
7401
+ func (m *SecretList) Reset()                    { *m = SecretList{} }
7402
+ func (*SecretList) ProtoMessage()               {}
7403
+-func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} }
7404
++func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} }
7405
+ 
7406
+ func (m *SecretProjection) Reset()                    { *m = SecretProjection{} }
7407
+ func (*SecretProjection) ProtoMessage()               {}
7408
+-func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} }
7409
++func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} }
7410
+ 
7411
+ func (m *SecretReference) Reset()                    { *m = SecretReference{} }
7412
+ func (*SecretReference) ProtoMessage()               {}
7413
+-func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} }
7414
++func (*SecretReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} }
7415
+ 
7416
+ func (m *SecretVolumeSource) Reset()                    { *m = SecretVolumeSource{} }
7417
+ func (*SecretVolumeSource) ProtoMessage()               {}
7418
+-func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} }
7419
++func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} }
7420
+ 
7421
+ func (m *SecurityContext) Reset()                    { *m = SecurityContext{} }
7422
+ func (*SecurityContext) ProtoMessage()               {}
7423
+-func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} }
7424
++func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} }
7425
+ 
7426
+ func (m *SerializedReference) Reset()                    { *m = SerializedReference{} }
7427
+ func (*SerializedReference) ProtoMessage()               {}
7428
+-func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} }
7429
++func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} }
7430
+ 
7431
+ func (m *Service) Reset()                    { *m = Service{} }
7432
+ func (*Service) ProtoMessage()               {}
7433
+-func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} }
7434
++func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} }
7435
+ 
7436
+ func (m *ServiceAccount) Reset()                    { *m = ServiceAccount{} }
7437
+ func (*ServiceAccount) ProtoMessage()               {}
7438
+-func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} }
7439
++func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} }
7440
+ 
7441
+ func (m *ServiceAccountList) Reset()                    { *m = ServiceAccountList{} }
7442
+ func (*ServiceAccountList) ProtoMessage()               {}
7443
+-func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{170} }
7444
++func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{171} }
7445
+ 
7446
+ func (m *ServiceAccountTokenProjection) Reset()      { *m = ServiceAccountTokenProjection{} }
7447
+ func (*ServiceAccountTokenProjection) ProtoMessage() {}
7448
+ func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) {
7449
+-	return fileDescriptorGenerated, []int{171}
7450
++	return fileDescriptorGenerated, []int{172}
7451
+ }
7452
+ 
7453
+ func (m *ServiceList) Reset()                    { *m = ServiceList{} }
7454
+ func (*ServiceList) ProtoMessage()               {}
7455
+-func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{172} }
7456
++func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} }
7457
+ 
7458
+ func (m *ServicePort) Reset()                    { *m = ServicePort{} }
7459
+ func (*ServicePort) ProtoMessage()               {}
7460
+-func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{173} }
7461
++func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} }
7462
+ 
7463
+ func (m *ServiceProxyOptions) Reset()                    { *m = ServiceProxyOptions{} }
7464
+ func (*ServiceProxyOptions) ProtoMessage()               {}
7465
+-func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{174} }
7466
++func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} }
7467
+ 
7468
+ func (m *ServiceSpec) Reset()                    { *m = ServiceSpec{} }
7469
+ func (*ServiceSpec) ProtoMessage()               {}
7470
+-func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{175} }
7471
++func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} }
7472
+ 
7473
+ func (m *ServiceStatus) Reset()                    { *m = ServiceStatus{} }
7474
+ func (*ServiceStatus) ProtoMessage()               {}
7475
+-func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{176} }
7476
++func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} }
7477
+ 
7478
+ func (m *SessionAffinityConfig) Reset()                    { *m = SessionAffinityConfig{} }
7479
+ func (*SessionAffinityConfig) ProtoMessage()               {}
7480
+-func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{177} }
7481
++func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{178} }
7482
+ 
7483
+ func (m *StorageOSPersistentVolumeSource) Reset()      { *m = StorageOSPersistentVolumeSource{} }
7484
+ func (*StorageOSPersistentVolumeSource) ProtoMessage() {}
7485
+ func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) {
7486
+-	return fileDescriptorGenerated, []int{178}
7487
++	return fileDescriptorGenerated, []int{179}
7488
+ }
7489
+ 
7490
+ func (m *StorageOSVolumeSource) Reset()                    { *m = StorageOSVolumeSource{} }
7491
+ func (*StorageOSVolumeSource) ProtoMessage()               {}
7492
+-func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{179} }
7493
++func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} }
7494
+ 
7495
+ func (m *Sysctl) Reset()                    { *m = Sysctl{} }
7496
+ func (*Sysctl) ProtoMessage()               {}
7497
+-func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{180} }
7498
++func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} }
7499
+ 
7500
+ func (m *TCPSocketAction) Reset()                    { *m = TCPSocketAction{} }
7501
+ func (*TCPSocketAction) ProtoMessage()               {}
7502
+-func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{181} }
7503
++func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} }
7504
+ 
7505
+ func (m *Taint) Reset()                    { *m = Taint{} }
7506
+ func (*Taint) ProtoMessage()               {}
7507
+-func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{182} }
7508
++func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} }
7509
+ 
7510
+ func (m *Toleration) Reset()                    { *m = Toleration{} }
7511
+ func (*Toleration) ProtoMessage()               {}
7512
+-func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{183} }
7513
++func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{184} }
7514
+ 
7515
+ func (m *TopologySelectorLabelRequirement) Reset()      { *m = TopologySelectorLabelRequirement{} }
7516
+ func (*TopologySelectorLabelRequirement) ProtoMessage() {}
7517
+ func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) {
7518
+-	return fileDescriptorGenerated, []int{184}
7519
++	return fileDescriptorGenerated, []int{185}
7520
+ }
7521
+ 
7522
+ func (m *TopologySelectorTerm) Reset()                    { *m = TopologySelectorTerm{} }
7523
+ func (*TopologySelectorTerm) ProtoMessage()               {}
7524
+-func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{185} }
7525
+ 
7526
++func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{186} }
7527
+ func (m *TypedLocalObjectReference) Reset()      { *m = TypedLocalObjectReference{} }
7528
+ func (*TypedLocalObjectReference) ProtoMessage() {}
7529
+ func (*TypedLocalObjectReference) Descriptor() ([]byte, []int) {
7530
+ 	return fileDescriptorGenerated, []int{186}
7531
+ }
7532
+-
7533
+ func (m *Volume) Reset()                    { *m = Volume{} }
7534
+ func (*Volume) ProtoMessage()               {}
7535
+ func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{187} }
7536
+@@ -1110,6 +1116,7 @@ func init() {
7537
+ 	proto.RegisterType((*Binding)(nil), "k8s.io.api.core.v1.Binding")
7538
+ 	proto.RegisterType((*CSIPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CSIPersistentVolumeSource")
7539
+ 	proto.RegisterType((*Capabilities)(nil), "k8s.io.api.core.v1.Capabilities")
7540
++	proto.RegisterType((*CascadeDiskVolumeSource)(nil), "k8s.io.api.core.v1.CascadeDiskVolumeSource")
7541
+ 	proto.RegisterType((*CephFSPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CephFSPersistentVolumeSource")
7542
+ 	proto.RegisterType((*CephFSVolumeSource)(nil), "k8s.io.api.core.v1.CephFSVolumeSource")
7543
+ 	proto.RegisterType((*CinderPersistentVolumeSource)(nil), "k8s.io.api.core.v1.CinderPersistentVolumeSource")
7544
+@@ -1737,6 +1744,32 @@ func (m *Capabilities) MarshalTo(dAtA []byte) (int, error) {
7545
+ 	return i, nil
7546
+ }
7547
+ 
7548
++func (m *CascadeDiskVolumeSource) Marshal() (dAtA []byte, err error) {
7549
++	size := m.Size()
7550
++	dAtA = make([]byte, size)
7551
++	n, err := m.MarshalTo(dAtA)
7552
++	if err != nil {
7553
++		return nil, err
7554
++	}
7555
++	return dAtA[:n], nil
7556
++}
7557
++
7558
++func (m *CascadeDiskVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7559
++	var i int
7560
++	_ = i
7561
++	var l int
7562
++	_ = l
7563
++	dAtA[i] = 0xa
7564
++	i++
7565
++	i = encodeVarintGenerated(dAtA, i, uint64(len(m.DiskID)))
7566
++	i += copy(dAtA[i:], m.DiskID)
7567
++	dAtA[i] = 0x12
7568
++	i++
7569
++	i = encodeVarintGenerated(dAtA, i, uint64(len(m.FSType)))
7570
++	i += copy(dAtA[i:], m.FSType)
7571
++	return i, nil
7572
++}
7573
++
7574
+ func (m *CephFSPersistentVolumeSource) Marshal() (dAtA []byte, err error) {
7575
+ 	size := m.Size()
7576
+ 	dAtA = make([]byte, size)
7577
+@@ -6428,13 +6461,13 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7578
+ 		}
7579
+ 		i += n127
7580
+ 	}
7581
+-	if m.AzureDisk != nil {
7582
++	if m.CascadeDisk != nil {
7583
+ 		dAtA[i] = 0x82
7584
+ 		i++
7585
+ 		dAtA[i] = 0x1
7586
+ 		i++
7587
+-		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
7588
+-		n128, err := m.AzureDisk.MarshalTo(dAtA[i:])
7589
++		i = encodeVarintGenerated(dAtA, i, uint64(m.CascadeDisk.Size()))
7590
++		n128, err := m.CascadeDisk.MarshalTo(dAtA[i:])
7591
+ 		if err != nil {
7592
+ 			return 0, err
7593
+ 		}
7594
+@@ -6512,6 +6545,18 @@ func (m *PersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7595
+ 		}
7596
+ 		i += n134
7597
+ 	}
7598
++	if m.AzureDisk != nil {
7599
++		dAtA[i] = 0xba
7600
++		i++
7601
++		dAtA[i] = 0x1
7602
++		i++
7603
++		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
7604
++		n135, err := m.AzureDisk.MarshalTo(dAtA[i:])
7605
++		if err != nil {
7606
++			return 0, err
7607
++		}
7608
++		i += n135
7609
++	}
7610
+ 	return i, nil
7611
+ }
7612
+ 
7613
+@@ -6554,21 +6599,21 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) {
7614
+ 			dAtA[i] = 0x12
7615
+ 			i++
7616
+ 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
7617
+-			n135, err := (&v).MarshalTo(dAtA[i:])
7618
++			n136, err := (&v).MarshalTo(dAtA[i:])
7619
+ 			if err != nil {
7620
+ 				return 0, err
7621
+ 			}
7622
+-			i += n135
7623
++			i += n136
7624
+ 		}
7625
+ 	}
7626
+ 	dAtA[i] = 0x12
7627
+ 	i++
7628
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeSource.Size()))
7629
+-	n136, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:])
7630
++	n137, err := m.PersistentVolumeSource.MarshalTo(dAtA[i:])
7631
+ 	if err != nil {
7632
+ 		return 0, err
7633
+ 	}
7634
+-	i += n136
7635
++	i += n137
7636
+ 	if len(m.AccessModes) > 0 {
7637
+ 		for _, s := range m.AccessModes {
7638
+ 			dAtA[i] = 0x1a
7639
+@@ -6588,11 +6633,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) {
7640
+ 		dAtA[i] = 0x22
7641
+ 		i++
7642
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ClaimRef.Size()))
7643
+-		n137, err := m.ClaimRef.MarshalTo(dAtA[i:])
7644
++		n138, err := m.ClaimRef.MarshalTo(dAtA[i:])
7645
+ 		if err != nil {
7646
+ 			return 0, err
7647
+ 		}
7648
+-		i += n137
7649
++		i += n138
7650
+ 	}
7651
+ 	dAtA[i] = 0x2a
7652
+ 	i++
7653
+@@ -6627,11 +6672,11 @@ func (m *PersistentVolumeSpec) MarshalTo(dAtA []byte) (int, error) {
7654
+ 		dAtA[i] = 0x4a
7655
+ 		i++
7656
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.NodeAffinity.Size()))
7657
+-		n138, err := m.NodeAffinity.MarshalTo(dAtA[i:])
7658
++		n139, err := m.NodeAffinity.MarshalTo(dAtA[i:])
7659
+ 		if err != nil {
7660
+ 			return 0, err
7661
+ 		}
7662
+-		i += n138
7663
++		i += n139
7664
+ 	}
7665
+ 	return i, nil
7666
+ }
7667
+@@ -6710,27 +6755,27 @@ func (m *Pod) MarshalTo(dAtA []byte) (int, error) {
7668
+ 	dAtA[i] = 0xa
7669
+ 	i++
7670
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7671
+-	n139, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7672
++	n140, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7673
+ 	if err != nil {
7674
+ 		return 0, err
7675
+ 	}
7676
+-	i += n139
7677
++	i += n140
7678
+ 	dAtA[i] = 0x12
7679
+ 	i++
7680
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
7681
+-	n140, err := m.Spec.MarshalTo(dAtA[i:])
7682
++	n141, err := m.Spec.MarshalTo(dAtA[i:])
7683
+ 	if err != nil {
7684
+ 		return 0, err
7685
+ 	}
7686
+-	i += n140
7687
++	i += n141
7688
+ 	dAtA[i] = 0x1a
7689
+ 	i++
7690
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
7691
+-	n141, err := m.Status.MarshalTo(dAtA[i:])
7692
++	n142, err := m.Status.MarshalTo(dAtA[i:])
7693
+ 	if err != nil {
7694
+ 		return 0, err
7695
+ 	}
7696
+-	i += n141
7697
++	i += n142
7698
+ 	return i, nil
7699
+ }
7700
+ 
7701
+@@ -6795,11 +6840,11 @@ func (m *PodAffinityTerm) MarshalTo(dAtA []byte) (int, error) {
7702
+ 		dAtA[i] = 0xa
7703
+ 		i++
7704
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.LabelSelector.Size()))
7705
+-		n142, err := m.LabelSelector.MarshalTo(dAtA[i:])
7706
++		n143, err := m.LabelSelector.MarshalTo(dAtA[i:])
7707
+ 		if err != nil {
7708
+ 			return 0, err
7709
+ 		}
7710
+-		i += n142
7711
++		i += n143
7712
+ 	}
7713
+ 	if len(m.Namespaces) > 0 {
7714
+ 		for _, s := range m.Namespaces {
7715
+@@ -6945,19 +6990,19 @@ func (m *PodCondition) MarshalTo(dAtA []byte) (int, error) {
7716
+ 	dAtA[i] = 0x1a
7717
+ 	i++
7718
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size()))
7719
+-	n143, err := m.LastProbeTime.MarshalTo(dAtA[i:])
7720
++	n144, err := m.LastProbeTime.MarshalTo(dAtA[i:])
7721
+ 	if err != nil {
7722
+ 		return 0, err
7723
+ 	}
7724
+-	i += n143
7725
++	i += n144
7726
+ 	dAtA[i] = 0x22
7727
+ 	i++
7728
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size()))
7729
+-	n144, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
7730
++	n145, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
7731
+ 	if err != nil {
7732
+ 		return 0, err
7733
+ 	}
7734
+-	i += n144
7735
++	i += n145
7736
+ 	dAtA[i] = 0x2a
7737
+ 	i++
7738
+ 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason)))
7739
+@@ -7144,11 +7189,11 @@ func (m *PodList) MarshalTo(dAtA []byte) (int, error) {
7740
+ 	dAtA[i] = 0xa
7741
+ 	i++
7742
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
7743
+-	n145, err := m.ListMeta.MarshalTo(dAtA[i:])
7744
++	n146, err := m.ListMeta.MarshalTo(dAtA[i:])
7745
+ 	if err != nil {
7746
+ 		return 0, err
7747
+ 	}
7748
+-	i += n145
7749
++	i += n146
7750
+ 	if len(m.Items) > 0 {
7751
+ 		for _, msg := range m.Items {
7752
+ 			dAtA[i] = 0x12
7753
+@@ -7208,11 +7253,11 @@ func (m *PodLogOptions) MarshalTo(dAtA []byte) (int, error) {
7754
+ 		dAtA[i] = 0x2a
7755
+ 		i++
7756
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SinceTime.Size()))
7757
+-		n146, err := m.SinceTime.MarshalTo(dAtA[i:])
7758
++		n147, err := m.SinceTime.MarshalTo(dAtA[i:])
7759
+ 		if err != nil {
7760
+ 			return 0, err
7761
+ 		}
7762
+-		i += n146
7763
++		i += n147
7764
+ 	}
7765
+ 	dAtA[i] = 0x30
7766
+ 	i++
7767
+@@ -7323,11 +7368,11 @@ func (m *PodSecurityContext) MarshalTo(dAtA []byte) (int, error) {
7768
+ 		dAtA[i] = 0xa
7769
+ 		i++
7770
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size()))
7771
+-		n147, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
7772
++		n148, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
7773
+ 		if err != nil {
7774
+ 			return 0, err
7775
+ 		}
7776
+-		i += n147
7777
++		i += n148
7778
+ 	}
7779
+ 	if m.RunAsUser != nil {
7780
+ 		dAtA[i] = 0x10
7781
+@@ -7395,11 +7440,11 @@ func (m *PodSignature) MarshalTo(dAtA []byte) (int, error) {
7782
+ 		dAtA[i] = 0xa
7783
+ 		i++
7784
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.PodController.Size()))
7785
+-		n148, err := m.PodController.MarshalTo(dAtA[i:])
7786
++		n149, err := m.PodController.MarshalTo(dAtA[i:])
7787
+ 		if err != nil {
7788
+ 			return 0, err
7789
+ 		}
7790
+-		i += n148
7791
++		i += n149
7792
+ 	}
7793
+ 	return i, nil
7794
+ }
7795
+@@ -7523,11 +7568,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) {
7796
+ 		dAtA[i] = 0x72
7797
+ 		i++
7798
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecurityContext.Size()))
7799
+-		n149, err := m.SecurityContext.MarshalTo(dAtA[i:])
7800
++		n150, err := m.SecurityContext.MarshalTo(dAtA[i:])
7801
+ 		if err != nil {
7802
+ 			return 0, err
7803
+ 		}
7804
+-		i += n149
7805
++		i += n150
7806
+ 	}
7807
+ 	if len(m.ImagePullSecrets) > 0 {
7808
+ 		for _, msg := range m.ImagePullSecrets {
7809
+@@ -7559,11 +7604,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) {
7810
+ 		dAtA[i] = 0x1
7811
+ 		i++
7812
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Affinity.Size()))
7813
+-		n150, err := m.Affinity.MarshalTo(dAtA[i:])
7814
++		n151, err := m.Affinity.MarshalTo(dAtA[i:])
7815
+ 		if err != nil {
7816
+ 			return 0, err
7817
+ 		}
7818
+-		i += n150
7819
++		i += n151
7820
+ 	}
7821
+ 	dAtA[i] = 0x9a
7822
+ 	i++
7823
+@@ -7644,11 +7689,11 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) {
7824
+ 		dAtA[i] = 0x1
7825
+ 		i++
7826
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.DNSConfig.Size()))
7827
+-		n151, err := m.DNSConfig.MarshalTo(dAtA[i:])
7828
++		n152, err := m.DNSConfig.MarshalTo(dAtA[i:])
7829
+ 		if err != nil {
7830
+ 			return 0, err
7831
+ 		}
7832
+-		i += n151
7833
++		i += n152
7834
+ 	}
7835
+ 	if m.ShareProcessNamespace != nil {
7836
+ 		dAtA[i] = 0xd8
7837
+@@ -7738,11 +7783,11 @@ func (m *PodStatus) MarshalTo(dAtA []byte) (int, error) {
7838
+ 		dAtA[i] = 0x3a
7839
+ 		i++
7840
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.StartTime.Size()))
7841
+-		n152, err := m.StartTime.MarshalTo(dAtA[i:])
7842
++		n153, err := m.StartTime.MarshalTo(dAtA[i:])
7843
+ 		if err != nil {
7844
+ 			return 0, err
7845
+ 		}
7846
+-		i += n152
7847
++		i += n153
7848
+ 	}
7849
+ 	if len(m.ContainerStatuses) > 0 {
7850
+ 		for _, msg := range m.ContainerStatuses {
7851
+@@ -7797,19 +7842,19 @@ func (m *PodStatusResult) MarshalTo(dAtA []byte) (int, error) {
7852
+ 	dAtA[i] = 0xa
7853
+ 	i++
7854
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7855
+-	n153, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7856
++	n154, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7857
+ 	if err != nil {
7858
+ 		return 0, err
7859
+ 	}
7860
+-	i += n153
7861
++	i += n154
7862
+ 	dAtA[i] = 0x12
7863
+ 	i++
7864
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
7865
+-	n154, err := m.Status.MarshalTo(dAtA[i:])
7866
++	n155, err := m.Status.MarshalTo(dAtA[i:])
7867
+ 	if err != nil {
7868
+ 		return 0, err
7869
+ 	}
7870
+-	i += n154
7871
++	i += n155
7872
+ 	return i, nil
7873
+ }
7874
+ 
7875
+@@ -7831,19 +7876,19 @@ func (m *PodTemplate) MarshalTo(dAtA []byte) (int, error) {
7876
+ 	dAtA[i] = 0xa
7877
+ 	i++
7878
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7879
+-	n155, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7880
++	n156, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7881
+ 	if err != nil {
7882
+ 		return 0, err
7883
+ 	}
7884
+-	i += n155
7885
++	i += n156
7886
+ 	dAtA[i] = 0x12
7887
+ 	i++
7888
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size()))
7889
+-	n156, err := m.Template.MarshalTo(dAtA[i:])
7890
++	n157, err := m.Template.MarshalTo(dAtA[i:])
7891
+ 	if err != nil {
7892
+ 		return 0, err
7893
+ 	}
7894
+-	i += n156
7895
++	i += n157
7896
+ 	return i, nil
7897
+ }
7898
+ 
7899
+@@ -7865,11 +7910,11 @@ func (m *PodTemplateList) MarshalTo(dAtA []byte) (int, error) {
7900
+ 	dAtA[i] = 0xa
7901
+ 	i++
7902
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
7903
+-	n157, err := m.ListMeta.MarshalTo(dAtA[i:])
7904
++	n158, err := m.ListMeta.MarshalTo(dAtA[i:])
7905
+ 	if err != nil {
7906
+ 		return 0, err
7907
+ 	}
7908
+-	i += n157
7909
++	i += n158
7910
+ 	if len(m.Items) > 0 {
7911
+ 		for _, msg := range m.Items {
7912
+ 			dAtA[i] = 0x12
7913
+@@ -7903,19 +7948,19 @@ func (m *PodTemplateSpec) MarshalTo(dAtA []byte) (int, error) {
7914
+ 	dAtA[i] = 0xa
7915
+ 	i++
7916
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
7917
+-	n158, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7918
++	n159, err := m.ObjectMeta.MarshalTo(dAtA[i:])
7919
+ 	if err != nil {
7920
+ 		return 0, err
7921
+ 	}
7922
+-	i += n158
7923
++	i += n159
7924
+ 	dAtA[i] = 0x12
7925
+ 	i++
7926
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
7927
+-	n159, err := m.Spec.MarshalTo(dAtA[i:])
7928
++	n160, err := m.Spec.MarshalTo(dAtA[i:])
7929
+ 	if err != nil {
7930
+ 		return 0, err
7931
+ 	}
7932
+-	i += n159
7933
++	i += n160
7934
+ 	return i, nil
7935
+ }
7936
+ 
7937
+@@ -7995,19 +8040,19 @@ func (m *PreferAvoidPodsEntry) MarshalTo(dAtA []byte) (int, error) {
7938
+ 	dAtA[i] = 0xa
7939
+ 	i++
7940
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.PodSignature.Size()))
7941
+-	n160, err := m.PodSignature.MarshalTo(dAtA[i:])
7942
++	n161, err := m.PodSignature.MarshalTo(dAtA[i:])
7943
+ 	if err != nil {
7944
+ 		return 0, err
7945
+ 	}
7946
+-	i += n160
7947
++	i += n161
7948
+ 	dAtA[i] = 0x12
7949
+ 	i++
7950
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.EvictionTime.Size()))
7951
+-	n161, err := m.EvictionTime.MarshalTo(dAtA[i:])
7952
++	n162, err := m.EvictionTime.MarshalTo(dAtA[i:])
7953
+ 	if err != nil {
7954
+ 		return 0, err
7955
+ 	}
7956
+-	i += n161
7957
++	i += n162
7958
+ 	dAtA[i] = 0x1a
7959
+ 	i++
7960
+ 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason)))
7961
+@@ -8040,11 +8085,11 @@ func (m *PreferredSchedulingTerm) MarshalTo(dAtA []byte) (int, error) {
7962
+ 	dAtA[i] = 0x12
7963
+ 	i++
7964
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Preference.Size()))
7965
+-	n162, err := m.Preference.MarshalTo(dAtA[i:])
7966
++	n163, err := m.Preference.MarshalTo(dAtA[i:])
7967
+ 	if err != nil {
7968
+ 		return 0, err
7969
+ 	}
7970
+-	i += n162
7971
++	i += n163
7972
+ 	return i, nil
7973
+ }
7974
+ 
7975
+@@ -8066,11 +8111,11 @@ func (m *Probe) MarshalTo(dAtA []byte) (int, error) {
7976
+ 	dAtA[i] = 0xa
7977
+ 	i++
7978
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Handler.Size()))
7979
+-	n163, err := m.Handler.MarshalTo(dAtA[i:])
7980
++	n164, err := m.Handler.MarshalTo(dAtA[i:])
7981
+ 	if err != nil {
7982
+ 		return 0, err
7983
+ 	}
7984
+-	i += n163
7985
++	i += n164
7986
+ 	dAtA[i] = 0x10
7987
+ 	i++
7988
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.InitialDelaySeconds))
7989
+@@ -8220,11 +8265,11 @@ func (m *RBDPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
7990
+ 		dAtA[i] = 0x3a
7991
+ 		i++
7992
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
7993
+-		n164, err := m.SecretRef.MarshalTo(dAtA[i:])
7994
++		n165, err := m.SecretRef.MarshalTo(dAtA[i:])
7995
+ 		if err != nil {
7996
+ 			return 0, err
7997
+ 		}
7998
+-		i += n164
7999
++		i += n165
8000
+ 	}
8001
+ 	dAtA[i] = 0x40
8002
+ 	i++
8003
+@@ -8291,11 +8336,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) {
8004
+ 		dAtA[i] = 0x3a
8005
+ 		i++
8006
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
8007
+-		n165, err := m.SecretRef.MarshalTo(dAtA[i:])
8008
++		n166, err := m.SecretRef.MarshalTo(dAtA[i:])
8009
+ 		if err != nil {
8010
+ 			return 0, err
8011
+ 		}
8012
+-		i += n165
8013
++		i += n166
8014
+ 	}
8015
+ 	dAtA[i] = 0x40
8016
+ 	i++
8017
+@@ -8326,11 +8371,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) {
8018
+ 	dAtA[i] = 0xa
8019
+ 	i++
8020
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8021
+-	n166, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8022
++	n167, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8023
+ 	if err != nil {
8024
+ 		return 0, err
8025
+ 	}
8026
+-	i += n166
8027
++	i += n167
8028
+ 	dAtA[i] = 0x12
8029
+ 	i++
8030
+ 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range)))
8031
+@@ -8362,27 +8407,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) {
8032
+ 	dAtA[i] = 0xa
8033
+ 	i++
8034
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8035
+-	n167, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8036
++	n168, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8037
+ 	if err != nil {
8038
+ 		return 0, err
8039
+ 	}
8040
+-	i += n167
8041
++	i += n168
8042
+ 	dAtA[i] = 0x12
8043
+ 	i++
8044
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
8045
+-	n168, err := m.Spec.MarshalTo(dAtA[i:])
8046
++	n169, err := m.Spec.MarshalTo(dAtA[i:])
8047
+ 	if err != nil {
8048
+ 		return 0, err
8049
+ 	}
8050
+-	i += n168
8051
++	i += n169
8052
+ 	dAtA[i] = 0x1a
8053
+ 	i++
8054
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
8055
+-	n169, err := m.Status.MarshalTo(dAtA[i:])
8056
++	n170, err := m.Status.MarshalTo(dAtA[i:])
8057
+ 	if err != nil {
8058
+ 		return 0, err
8059
+ 	}
8060
+-	i += n169
8061
++	i += n170
8062
+ 	return i, nil
8063
+ }
8064
+ 
8065
+@@ -8412,11 +8457,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) {
8066
+ 	dAtA[i] = 0x1a
8067
+ 	i++
8068
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size()))
8069
+-	n170, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
8070
++	n171, err := m.LastTransitionTime.MarshalTo(dAtA[i:])
8071
+ 	if err != nil {
8072
+ 		return 0, err
8073
+ 	}
8074
+-	i += n170
8075
++	i += n171
8076
+ 	dAtA[i] = 0x22
8077
+ 	i++
8078
+ 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason)))
8079
+@@ -8446,11 +8491,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) {
8080
+ 	dAtA[i] = 0xa
8081
+ 	i++
8082
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
8083
+-	n171, err := m.ListMeta.MarshalTo(dAtA[i:])
8084
++	n172, err := m.ListMeta.MarshalTo(dAtA[i:])
8085
+ 	if err != nil {
8086
+ 		return 0, err
8087
+ 	}
8088
+-	i += n171
8089
++	i += n172
8090
+ 	if len(m.Items) > 0 {
8091
+ 		for _, msg := range m.Items {
8092
+ 			dAtA[i] = 0x12
8093
+@@ -8512,11 +8557,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) {
8094
+ 		dAtA[i] = 0x1a
8095
+ 		i++
8096
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size()))
8097
+-		n172, err := m.Template.MarshalTo(dAtA[i:])
8098
++		n173, err := m.Template.MarshalTo(dAtA[i:])
8099
+ 		if err != nil {
8100
+ 			return 0, err
8101
+ 		}
8102
+-		i += n172
8103
++		i += n173
8104
+ 	}
8105
+ 	dAtA[i] = 0x20
8106
+ 	i++
8107
+@@ -8595,11 +8640,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) {
8108
+ 	dAtA[i] = 0x1a
8109
+ 	i++
8110
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size()))
8111
+-	n173, err := m.Divisor.MarshalTo(dAtA[i:])
8112
++	n174, err := m.Divisor.MarshalTo(dAtA[i:])
8113
+ 	if err != nil {
8114
+ 		return 0, err
8115
+ 	}
8116
+-	i += n173
8117
++	i += n174
8118
+ 	return i, nil
8119
+ }
8120
+ 
8121
+@@ -8621,27 +8666,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) {
8122
+ 	dAtA[i] = 0xa
8123
+ 	i++
8124
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8125
+-	n174, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8126
++	n175, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8127
+ 	if err != nil {
8128
+ 		return 0, err
8129
+ 	}
8130
+-	i += n174
8131
++	i += n175
8132
+ 	dAtA[i] = 0x12
8133
+ 	i++
8134
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
8135
+-	n175, err := m.Spec.MarshalTo(dAtA[i:])
8136
++	n176, err := m.Spec.MarshalTo(dAtA[i:])
8137
+ 	if err != nil {
8138
+ 		return 0, err
8139
+ 	}
8140
+-	i += n175
8141
++	i += n176
8142
+ 	dAtA[i] = 0x1a
8143
+ 	i++
8144
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
8145
+-	n176, err := m.Status.MarshalTo(dAtA[i:])
8146
++	n177, err := m.Status.MarshalTo(dAtA[i:])
8147
+ 	if err != nil {
8148
+ 		return 0, err
8149
+ 	}
8150
+-	i += n176
8151
++	i += n177
8152
+ 	return i, nil
8153
+ }
8154
+ 
8155
+@@ -8663,11 +8708,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) {
8156
+ 	dAtA[i] = 0xa
8157
+ 	i++
8158
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
8159
+-	n177, err := m.ListMeta.MarshalTo(dAtA[i:])
8160
++	n178, err := m.ListMeta.MarshalTo(dAtA[i:])
8161
+ 	if err != nil {
8162
+ 		return 0, err
8163
+ 	}
8164
+-	i += n177
8165
++	i += n178
8166
+ 	if len(m.Items) > 0 {
8167
+ 		for _, msg := range m.Items {
8168
+ 			dAtA[i] = 0x12
8169
+@@ -8722,11 +8767,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) {
8170
+ 			dAtA[i] = 0x12
8171
+ 			i++
8172
+ 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
8173
+-			n178, err := (&v).MarshalTo(dAtA[i:])
8174
++			n179, err := (&v).MarshalTo(dAtA[i:])
8175
+ 			if err != nil {
8176
+ 				return 0, err
8177
+ 			}
8178
+-			i += n178
8179
++			i += n179
8180
+ 		}
8181
+ 	}
8182
+ 	if len(m.Scopes) > 0 {
8183
+@@ -8748,11 +8793,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) {
8184
+ 		dAtA[i] = 0x1a
8185
+ 		i++
8186
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ScopeSelector.Size()))
8187
+-		n179, err := m.ScopeSelector.MarshalTo(dAtA[i:])
8188
++		n180, err := m.ScopeSelector.MarshalTo(dAtA[i:])
8189
+ 		if err != nil {
8190
+ 			return 0, err
8191
+ 		}
8192
+-		i += n179
8193
++		i += n180
8194
+ 	}
8195
+ 	return i, nil
8196
+ }
8197
+@@ -8796,11 +8841,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) {
8198
+ 			dAtA[i] = 0x12
8199
+ 			i++
8200
+ 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
8201
+-			n180, err := (&v).MarshalTo(dAtA[i:])
8202
++			n181, err := (&v).MarshalTo(dAtA[i:])
8203
+ 			if err != nil {
8204
+ 				return 0, err
8205
+ 			}
8206
+-			i += n180
8207
++			i += n181
8208
+ 		}
8209
+ 	}
8210
+ 	if len(m.Used) > 0 {
8211
+@@ -8827,11 +8872,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) {
8212
+ 			dAtA[i] = 0x12
8213
+ 			i++
8214
+ 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
8215
+-			n181, err := (&v).MarshalTo(dAtA[i:])
8216
++			n182, err := (&v).MarshalTo(dAtA[i:])
8217
+ 			if err != nil {
8218
+ 				return 0, err
8219
+ 			}
8220
+-			i += n181
8221
++			i += n182
8222
+ 		}
8223
+ 	}
8224
+ 	return i, nil
8225
+@@ -8876,11 +8921,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) {
8226
+ 			dAtA[i] = 0x12
8227
+ 			i++
8228
+ 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
8229
+-			n182, err := (&v).MarshalTo(dAtA[i:])
8230
++			n183, err := (&v).MarshalTo(dAtA[i:])
8231
+ 			if err != nil {
8232
+ 				return 0, err
8233
+ 			}
8234
+-			i += n182
8235
++			i += n183
8236
+ 		}
8237
+ 	}
8238
+ 	if len(m.Requests) > 0 {
8239
+@@ -8907,11 +8952,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) {
8240
+ 			dAtA[i] = 0x12
8241
+ 			i++
8242
+ 			i = encodeVarintGenerated(dAtA, i, uint64((&v).Size()))
8243
+-			n183, err := (&v).MarshalTo(dAtA[i:])
8244
++			n184, err := (&v).MarshalTo(dAtA[i:])
8245
+ 			if err != nil {
8246
+ 				return 0, err
8247
+ 			}
8248
+-			i += n183
8249
++			i += n184
8250
+ 		}
8251
+ 	}
8252
+ 	return i, nil
8253
+@@ -8978,11 +9023,11 @@ func (m *ScaleIOPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
8254
+ 		dAtA[i] = 0x1a
8255
+ 		i++
8256
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
8257
+-		n184, err := m.SecretRef.MarshalTo(dAtA[i:])
8258
++		n185, err := m.SecretRef.MarshalTo(dAtA[i:])
8259
+ 		if err != nil {
8260
+ 			return 0, err
8261
+ 		}
8262
+-		i += n184
8263
++		i += n185
8264
+ 	}
8265
+ 	dAtA[i] = 0x20
8266
+ 	i++
8267
+@@ -9050,11 +9095,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) {
8268
+ 		dAtA[i] = 0x1a
8269
+ 		i++
8270
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
8271
+-		n185, err := m.SecretRef.MarshalTo(dAtA[i:])
8272
++		n186, err := m.SecretRef.MarshalTo(dAtA[i:])
8273
+ 		if err != nil {
8274
+ 			return 0, err
8275
+ 		}
8276
+-		i += n185
8277
++		i += n186
8278
+ 	}
8279
+ 	dAtA[i] = 0x20
8280
+ 	i++
8281
+@@ -9184,11 +9229,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) {
8282
+ 	dAtA[i] = 0xa
8283
+ 	i++
8284
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8285
+-	n186, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8286
++	n187, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8287
+ 	if err != nil {
8288
+ 		return 0, err
8289
+ 	}
8290
+-	i += n186
8291
++	i += n187
8292
+ 	if len(m.Data) > 0 {
8293
+ 		keysForData := make([]string, 0, len(m.Data))
8294
+ 		for k := range m.Data {
8295
+@@ -9264,11 +9309,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) {
8296
+ 	dAtA[i] = 0xa
8297
+ 	i++
8298
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size()))
8299
+-	n187, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
8300
++	n188, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
8301
+ 	if err != nil {
8302
+ 		return 0, err
8303
+ 	}
8304
+-	i += n187
8305
++	i += n188
8306
+ 	if m.Optional != nil {
8307
+ 		dAtA[i] = 0x10
8308
+ 		i++
8309
+@@ -9300,11 +9345,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) {
8310
+ 	dAtA[i] = 0xa
8311
+ 	i++
8312
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size()))
8313
+-	n188, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
8314
++	n189, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
8315
+ 	if err != nil {
8316
+ 		return 0, err
8317
+ 	}
8318
+-	i += n188
8319
++	i += n189
8320
+ 	dAtA[i] = 0x12
8321
+ 	i++
8322
+ 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key)))
8323
+@@ -9340,11 +9385,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) {
8324
+ 	dAtA[i] = 0xa
8325
+ 	i++
8326
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
8327
+-	n189, err := m.ListMeta.MarshalTo(dAtA[i:])
8328
++	n190, err := m.ListMeta.MarshalTo(dAtA[i:])
8329
+ 	if err != nil {
8330
+ 		return 0, err
8331
+ 	}
8332
+-	i += n189
8333
++	i += n190
8334
+ 	if len(m.Items) > 0 {
8335
+ 		for _, msg := range m.Items {
8336
+ 			dAtA[i] = 0x12
8337
+@@ -9378,11 +9423,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) {
8338
+ 	dAtA[i] = 0xa
8339
+ 	i++
8340
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size()))
8341
+-	n190, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
8342
++	n191, err := m.LocalObjectReference.MarshalTo(dAtA[i:])
8343
+ 	if err != nil {
8344
+ 		return 0, err
8345
+ 	}
8346
+-	i += n190
8347
++	i += n191
8348
+ 	if len(m.Items) > 0 {
8349
+ 		for _, msg := range m.Items {
8350
+ 			dAtA[i] = 0x12
8351
+@@ -9502,11 +9547,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) {
8352
+ 		dAtA[i] = 0xa
8353
+ 		i++
8354
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size()))
8355
+-		n191, err := m.Capabilities.MarshalTo(dAtA[i:])
8356
++		n192, err := m.Capabilities.MarshalTo(dAtA[i:])
8357
+ 		if err != nil {
8358
+ 			return 0, err
8359
+ 		}
8360
+-		i += n191
8361
++		i += n192
8362
+ 	}
8363
+ 	if m.Privileged != nil {
8364
+ 		dAtA[i] = 0x10
8365
+@@ -9522,11 +9567,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) {
8366
+ 		dAtA[i] = 0x1a
8367
+ 		i++
8368
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size()))
8369
+-		n192, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
8370
++		n193, err := m.SELinuxOptions.MarshalTo(dAtA[i:])
8371
+ 		if err != nil {
8372
+ 			return 0, err
8373
+ 		}
8374
+-		i += n192
8375
++		i += n193
8376
+ 	}
8377
+ 	if m.RunAsUser != nil {
8378
+ 		dAtA[i] = 0x20
8379
+@@ -9595,11 +9640,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) {
8380
+ 	dAtA[i] = 0xa
8381
+ 	i++
8382
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size()))
8383
+-	n193, err := m.Reference.MarshalTo(dAtA[i:])
8384
++	n194, err := m.Reference.MarshalTo(dAtA[i:])
8385
+ 	if err != nil {
8386
+ 		return 0, err
8387
+ 	}
8388
+-	i += n193
8389
++	i += n194
8390
+ 	return i, nil
8391
+ }
8392
+ 
8393
+@@ -9621,27 +9666,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) {
8394
+ 	dAtA[i] = 0xa
8395
+ 	i++
8396
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8397
+-	n194, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8398
++	n195, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8399
+ 	if err != nil {
8400
+ 		return 0, err
8401
+ 	}
8402
+-	i += n194
8403
++	i += n195
8404
+ 	dAtA[i] = 0x12
8405
+ 	i++
8406
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size()))
8407
+-	n195, err := m.Spec.MarshalTo(dAtA[i:])
8408
++	n196, err := m.Spec.MarshalTo(dAtA[i:])
8409
+ 	if err != nil {
8410
+ 		return 0, err
8411
+ 	}
8412
+-	i += n195
8413
++	i += n196
8414
+ 	dAtA[i] = 0x1a
8415
+ 	i++
8416
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size()))
8417
+-	n196, err := m.Status.MarshalTo(dAtA[i:])
8418
++	n197, err := m.Status.MarshalTo(dAtA[i:])
8419
+ 	if err != nil {
8420
+ 		return 0, err
8421
+ 	}
8422
+-	i += n196
8423
++	i += n197
8424
+ 	return i, nil
8425
+ }
8426
+ 
8427
+@@ -9663,11 +9708,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) {
8428
+ 	dAtA[i] = 0xa
8429
+ 	i++
8430
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size()))
8431
+-	n197, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8432
++	n198, err := m.ObjectMeta.MarshalTo(dAtA[i:])
8433
+ 	if err != nil {
8434
+ 		return 0, err
8435
+ 	}
8436
+-	i += n197
8437
++	i += n198
8438
+ 	if len(m.Secrets) > 0 {
8439
+ 		for _, msg := range m.Secrets {
8440
+ 			dAtA[i] = 0x12
8441
+@@ -9723,11 +9768,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) {
8442
+ 	dAtA[i] = 0xa
8443
+ 	i++
8444
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
8445
+-	n198, err := m.ListMeta.MarshalTo(dAtA[i:])
8446
++	n199, err := m.ListMeta.MarshalTo(dAtA[i:])
8447
+ 	if err != nil {
8448
+ 		return 0, err
8449
+ 	}
8450
+-	i += n198
8451
++	i += n199
8452
+ 	if len(m.Items) > 0 {
8453
+ 		for _, msg := range m.Items {
8454
+ 			dAtA[i] = 0x12
8455
+@@ -9792,11 +9837,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) {
8456
+ 	dAtA[i] = 0xa
8457
+ 	i++
8458
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size()))
8459
+-	n199, err := m.ListMeta.MarshalTo(dAtA[i:])
8460
++	n200, err := m.ListMeta.MarshalTo(dAtA[i:])
8461
+ 	if err != nil {
8462
+ 		return 0, err
8463
+ 	}
8464
+-	i += n199
8465
++	i += n200
8466
+ 	if len(m.Items) > 0 {
8467
+ 		for _, msg := range m.Items {
8468
+ 			dAtA[i] = 0x12
8469
+@@ -9841,11 +9886,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) {
8470
+ 	dAtA[i] = 0x22
8471
+ 	i++
8472
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size()))
8473
+-	n200, err := m.TargetPort.MarshalTo(dAtA[i:])
8474
++	n201, err := m.TargetPort.MarshalTo(dAtA[i:])
8475
+ 	if err != nil {
8476
+ 		return 0, err
8477
+ 	}
8478
+-	i += n200
8479
++	i += n201
8480
+ 	dAtA[i] = 0x28
8481
+ 	i++
8482
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort))
8483
+@@ -9992,11 +10037,11 @@ func (m *ServiceSpec) MarshalTo(dAtA []byte) (int, error) {
8484
+ 		dAtA[i] = 0x72
8485
+ 		i++
8486
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SessionAffinityConfig.Size()))
8487
+-		n201, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:])
8488
++		n202, err := m.SessionAffinityConfig.MarshalTo(dAtA[i:])
8489
+ 		if err != nil {
8490
+ 			return 0, err
8491
+ 		}
8492
+-		i += n201
8493
++		i += n202
8494
+ 	}
8495
+ 	return i, nil
8496
+ }
8497
+@@ -10019,11 +10064,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) {
8498
+ 	dAtA[i] = 0xa
8499
+ 	i++
8500
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size()))
8501
+-	n202, err := m.LoadBalancer.MarshalTo(dAtA[i:])
8502
++	n203, err := m.LoadBalancer.MarshalTo(dAtA[i:])
8503
+ 	if err != nil {
8504
+ 		return 0, err
8505
+ 	}
8506
+-	i += n202
8507
++	i += n203
8508
+ 	return i, nil
8509
+ }
8510
+ 
8511
+@@ -10046,11 +10091,11 @@ func (m *SessionAffinityConfig) MarshalTo(dAtA []byte) (int, error) {
8512
+ 		dAtA[i] = 0xa
8513
+ 		i++
8514
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ClientIP.Size()))
8515
+-		n203, err := m.ClientIP.MarshalTo(dAtA[i:])
8516
++		n204, err := m.ClientIP.MarshalTo(dAtA[i:])
8517
+ 		if err != nil {
8518
+ 			return 0, err
8519
+ 		}
8520
+-		i += n203
8521
++		i += n204
8522
+ 	}
8523
+ 	return i, nil
8524
+ }
8525
+@@ -10094,11 +10139,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) {
8526
+ 		dAtA[i] = 0x2a
8527
+ 		i++
8528
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
8529
+-		n204, err := m.SecretRef.MarshalTo(dAtA[i:])
8530
++		n205, err := m.SecretRef.MarshalTo(dAtA[i:])
8531
+ 		if err != nil {
8532
+ 			return 0, err
8533
+ 		}
8534
+-		i += n204
8535
++		i += n205
8536
+ 	}
8537
+ 	return i, nil
8538
+ }
8539
+@@ -10142,11 +10187,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) {
8540
+ 		dAtA[i] = 0x2a
8541
+ 		i++
8542
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size()))
8543
+-		n205, err := m.SecretRef.MarshalTo(dAtA[i:])
8544
++		n206, err := m.SecretRef.MarshalTo(dAtA[i:])
8545
+ 		if err != nil {
8546
+ 			return 0, err
8547
+ 		}
8548
+-		i += n205
8549
++		i += n206
8550
+ 	}
8551
+ 	return i, nil
8552
+ }
8553
+@@ -10195,11 +10240,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) {
8554
+ 	dAtA[i] = 0xa
8555
+ 	i++
8556
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size()))
8557
+-	n206, err := m.Port.MarshalTo(dAtA[i:])
8558
++	n207, err := m.Port.MarshalTo(dAtA[i:])
8559
+ 	if err != nil {
8560
+ 		return 0, err
8561
+ 	}
8562
+-	i += n206
8563
++	i += n207
8564
+ 	dAtA[i] = 0x12
8565
+ 	i++
8566
+ 	i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host)))
8567
+@@ -10238,11 +10283,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) {
8568
+ 		dAtA[i] = 0x22
8569
+ 		i++
8570
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size()))
8571
+-		n207, err := m.TimeAdded.MarshalTo(dAtA[i:])
8572
++		n208, err := m.TimeAdded.MarshalTo(dAtA[i:])
8573
+ 		if err != nil {
8574
+ 			return 0, err
8575
+ 		}
8576
+-		i += n207
8577
++		i += n208
8578
+ 	}
8579
+ 	return i, nil
8580
+ }
8581
+@@ -10352,7 +10397,6 @@ func (m *TopologySelectorTerm) MarshalTo(dAtA []byte) (int, error) {
8582
+ 	}
8583
+ 	return i, nil
8584
+ }
8585
+-
8586
+ func (m *TypedLocalObjectReference) Marshal() (dAtA []byte, err error) {
8587
+ 	size := m.Size()
8588
+ 	dAtA = make([]byte, size)
8589
+@@ -10407,11 +10451,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) {
8590
+ 	dAtA[i] = 0x12
8591
+ 	i++
8592
+ 	i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size()))
8593
+-	n208, err := m.VolumeSource.MarshalTo(dAtA[i:])
8594
++	n209, err := m.VolumeSource.MarshalTo(dAtA[i:])
8595
+ 	if err != nil {
8596
+ 		return 0, err
8597
+ 	}
8598
+-	i += n208
8599
++	i += n209
8600
+ 	return i, nil
8601
+ }
8602
+ 
8603
+@@ -10504,11 +10548,11 @@ func (m *VolumeNodeAffinity) MarshalTo(dAtA []byte) (int, error) {
8604
+ 		dAtA[i] = 0xa
8605
+ 		i++
8606
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Required.Size()))
8607
+-		n209, err := m.Required.MarshalTo(dAtA[i:])
8608
++		n210, err := m.Required.MarshalTo(dAtA[i:])
8609
+ 		if err != nil {
8610
+ 			return 0, err
8611
+ 		}
8612
+-		i += n209
8613
++		i += n210
8614
+ 	}
8615
+ 	return i, nil
8616
+ }
8617
+@@ -10532,41 +10576,41 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) {
8618
+ 		dAtA[i] = 0xa
8619
+ 		i++
8620
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size()))
8621
+-		n210, err := m.Secret.MarshalTo(dAtA[i:])
8622
++		n211, err := m.Secret.MarshalTo(dAtA[i:])
8623
+ 		if err != nil {
8624
+ 			return 0, err
8625
+ 		}
8626
+-		i += n210
8627
++		i += n211
8628
+ 	}
8629
+ 	if m.DownwardAPI != nil {
8630
+ 		dAtA[i] = 0x12
8631
+ 		i++
8632
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size()))
8633
+-		n211, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8634
++		n212, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8635
+ 		if err != nil {
8636
+ 			return 0, err
8637
+ 		}
8638
+-		i += n211
8639
++		i += n212
8640
+ 	}
8641
+ 	if m.ConfigMap != nil {
8642
+ 		dAtA[i] = 0x1a
8643
+ 		i++
8644
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size()))
8645
+-		n212, err := m.ConfigMap.MarshalTo(dAtA[i:])
8646
++		n213, err := m.ConfigMap.MarshalTo(dAtA[i:])
8647
+ 		if err != nil {
8648
+ 			return 0, err
8649
+ 		}
8650
+-		i += n212
8651
++		i += n213
8652
+ 	}
8653
+ 	if m.ServiceAccountToken != nil {
8654
+ 		dAtA[i] = 0x22
8655
+ 		i++
8656
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ServiceAccountToken.Size()))
8657
+-		n213, err := m.ServiceAccountToken.MarshalTo(dAtA[i:])
8658
++		n214, err := m.ServiceAccountToken.MarshalTo(dAtA[i:])
8659
+ 		if err != nil {
8660
+ 			return 0, err
8661
+ 		}
8662
+-		i += n213
8663
++		i += n214
8664
+ 	}
8665
+ 	return i, nil
8666
+ }
8667
+@@ -10590,151 +10634,151 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8668
+ 		dAtA[i] = 0xa
8669
+ 		i++
8670
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size()))
8671
+-		n214, err := m.HostPath.MarshalTo(dAtA[i:])
8672
++		n215, err := m.HostPath.MarshalTo(dAtA[i:])
8673
+ 		if err != nil {
8674
+ 			return 0, err
8675
+ 		}
8676
+-		i += n214
8677
++		i += n215
8678
+ 	}
8679
+ 	if m.EmptyDir != nil {
8680
+ 		dAtA[i] = 0x12
8681
+ 		i++
8682
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size()))
8683
+-		n215, err := m.EmptyDir.MarshalTo(dAtA[i:])
8684
++		n216, err := m.EmptyDir.MarshalTo(dAtA[i:])
8685
+ 		if err != nil {
8686
+ 			return 0, err
8687
+ 		}
8688
+-		i += n215
8689
++		i += n216
8690
+ 	}
8691
+ 	if m.GCEPersistentDisk != nil {
8692
+ 		dAtA[i] = 0x1a
8693
+ 		i++
8694
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size()))
8695
+-		n216, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:])
8696
++		n217, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:])
8697
+ 		if err != nil {
8698
+ 			return 0, err
8699
+ 		}
8700
+-		i += n216
8701
++		i += n217
8702
+ 	}
8703
+ 	if m.AWSElasticBlockStore != nil {
8704
+ 		dAtA[i] = 0x22
8705
+ 		i++
8706
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size()))
8707
+-		n217, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:])
8708
++		n218, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:])
8709
+ 		if err != nil {
8710
+ 			return 0, err
8711
+ 		}
8712
+-		i += n217
8713
++		i += n218
8714
+ 	}
8715
+ 	if m.GitRepo != nil {
8716
+ 		dAtA[i] = 0x2a
8717
+ 		i++
8718
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size()))
8719
+-		n218, err := m.GitRepo.MarshalTo(dAtA[i:])
8720
++		n219, err := m.GitRepo.MarshalTo(dAtA[i:])
8721
+ 		if err != nil {
8722
+ 			return 0, err
8723
+ 		}
8724
+-		i += n218
8725
++		i += n219
8726
+ 	}
8727
+ 	if m.Secret != nil {
8728
+ 		dAtA[i] = 0x32
8729
+ 		i++
8730
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size()))
8731
+-		n219, err := m.Secret.MarshalTo(dAtA[i:])
8732
++		n220, err := m.Secret.MarshalTo(dAtA[i:])
8733
+ 		if err != nil {
8734
+ 			return 0, err
8735
+ 		}
8736
+-		i += n219
8737
++		i += n220
8738
+ 	}
8739
+ 	if m.NFS != nil {
8740
+ 		dAtA[i] = 0x3a
8741
+ 		i++
8742
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size()))
8743
+-		n220, err := m.NFS.MarshalTo(dAtA[i:])
8744
++		n221, err := m.NFS.MarshalTo(dAtA[i:])
8745
+ 		if err != nil {
8746
+ 			return 0, err
8747
+ 		}
8748
+-		i += n220
8749
++		i += n221
8750
+ 	}
8751
+ 	if m.ISCSI != nil {
8752
+ 		dAtA[i] = 0x42
8753
+ 		i++
8754
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size()))
8755
+-		n221, err := m.ISCSI.MarshalTo(dAtA[i:])
8756
++		n222, err := m.ISCSI.MarshalTo(dAtA[i:])
8757
+ 		if err != nil {
8758
+ 			return 0, err
8759
+ 		}
8760
+-		i += n221
8761
++		i += n222
8762
+ 	}
8763
+ 	if m.Glusterfs != nil {
8764
+ 		dAtA[i] = 0x4a
8765
+ 		i++
8766
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size()))
8767
+-		n222, err := m.Glusterfs.MarshalTo(dAtA[i:])
8768
++		n223, err := m.Glusterfs.MarshalTo(dAtA[i:])
8769
+ 		if err != nil {
8770
+ 			return 0, err
8771
+ 		}
8772
+-		i += n222
8773
++		i += n223
8774
+ 	}
8775
+ 	if m.PersistentVolumeClaim != nil {
8776
+ 		dAtA[i] = 0x52
8777
+ 		i++
8778
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size()))
8779
+-		n223, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:])
8780
++		n224, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:])
8781
+ 		if err != nil {
8782
+ 			return 0, err
8783
+ 		}
8784
+-		i += n223
8785
++		i += n224
8786
+ 	}
8787
+ 	if m.RBD != nil {
8788
+ 		dAtA[i] = 0x5a
8789
+ 		i++
8790
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size()))
8791
+-		n224, err := m.RBD.MarshalTo(dAtA[i:])
8792
++		n225, err := m.RBD.MarshalTo(dAtA[i:])
8793
+ 		if err != nil {
8794
+ 			return 0, err
8795
+ 		}
8796
+-		i += n224
8797
++		i += n225
8798
+ 	}
8799
+ 	if m.FlexVolume != nil {
8800
+ 		dAtA[i] = 0x62
8801
+ 		i++
8802
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size()))
8803
+-		n225, err := m.FlexVolume.MarshalTo(dAtA[i:])
8804
++		n226, err := m.FlexVolume.MarshalTo(dAtA[i:])
8805
+ 		if err != nil {
8806
+ 			return 0, err
8807
+ 		}
8808
+-		i += n225
8809
++		i += n226
8810
+ 	}
8811
+ 	if m.Cinder != nil {
8812
+ 		dAtA[i] = 0x6a
8813
+ 		i++
8814
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size()))
8815
+-		n226, err := m.Cinder.MarshalTo(dAtA[i:])
8816
++		n227, err := m.Cinder.MarshalTo(dAtA[i:])
8817
+ 		if err != nil {
8818
+ 			return 0, err
8819
+ 		}
8820
+-		i += n226
8821
++		i += n227
8822
+ 	}
8823
+ 	if m.CephFS != nil {
8824
+ 		dAtA[i] = 0x72
8825
+ 		i++
8826
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size()))
8827
+-		n227, err := m.CephFS.MarshalTo(dAtA[i:])
8828
++		n228, err := m.CephFS.MarshalTo(dAtA[i:])
8829
+ 		if err != nil {
8830
+ 			return 0, err
8831
+ 		}
8832
+-		i += n227
8833
++		i += n228
8834
+ 	}
8835
+ 	if m.Flocker != nil {
8836
+ 		dAtA[i] = 0x7a
8837
+ 		i++
8838
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size()))
8839
+-		n228, err := m.Flocker.MarshalTo(dAtA[i:])
8840
++		n229, err := m.Flocker.MarshalTo(dAtA[i:])
8841
+ 		if err != nil {
8842
+ 			return 0, err
8843
+ 		}
8844
+-		i += n228
8845
++		i += n229
8846
+ 	}
8847
+ 	if m.DownwardAPI != nil {
8848
+ 		dAtA[i] = 0x82
8849
+@@ -10742,11 +10786,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8850
+ 		dAtA[i] = 0x1
8851
+ 		i++
8852
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size()))
8853
+-		n229, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8854
++		n230, err := m.DownwardAPI.MarshalTo(dAtA[i:])
8855
+ 		if err != nil {
8856
+ 			return 0, err
8857
+ 		}
8858
+-		i += n229
8859
++		i += n230
8860
+ 	}
8861
+ 	if m.FC != nil {
8862
+ 		dAtA[i] = 0x8a
8863
+@@ -10754,11 +10798,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8864
+ 		dAtA[i] = 0x1
8865
+ 		i++
8866
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size()))
8867
+-		n230, err := m.FC.MarshalTo(dAtA[i:])
8868
++		n231, err := m.FC.MarshalTo(dAtA[i:])
8869
+ 		if err != nil {
8870
+ 			return 0, err
8871
+ 		}
8872
+-		i += n230
8873
++		i += n231
8874
+ 	}
8875
+ 	if m.AzureFile != nil {
8876
+ 		dAtA[i] = 0x92
8877
+@@ -10766,11 +10810,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8878
+ 		dAtA[i] = 0x1
8879
+ 		i++
8880
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size()))
8881
+-		n231, err := m.AzureFile.MarshalTo(dAtA[i:])
8882
++		n232, err := m.AzureFile.MarshalTo(dAtA[i:])
8883
+ 		if err != nil {
8884
+ 			return 0, err
8885
+ 		}
8886
+-		i += n231
8887
++		i += n232
8888
+ 	}
8889
+ 	if m.ConfigMap != nil {
8890
+ 		dAtA[i] = 0x9a
8891
+@@ -10778,11 +10822,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8892
+ 		dAtA[i] = 0x1
8893
+ 		i++
8894
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size()))
8895
+-		n232, err := m.ConfigMap.MarshalTo(dAtA[i:])
8896
++		n233, err := m.ConfigMap.MarshalTo(dAtA[i:])
8897
+ 		if err != nil {
8898
+ 			return 0, err
8899
+ 		}
8900
+-		i += n232
8901
++		i += n233
8902
+ 	}
8903
+ 	if m.VsphereVolume != nil {
8904
+ 		dAtA[i] = 0xa2
8905
+@@ -10790,11 +10834,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8906
+ 		dAtA[i] = 0x1
8907
+ 		i++
8908
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size()))
8909
+-		n233, err := m.VsphereVolume.MarshalTo(dAtA[i:])
8910
++		n234, err := m.VsphereVolume.MarshalTo(dAtA[i:])
8911
+ 		if err != nil {
8912
+ 			return 0, err
8913
+ 		}
8914
+-		i += n233
8915
++		i += n234
8916
+ 	}
8917
+ 	if m.Quobyte != nil {
8918
+ 		dAtA[i] = 0xaa
8919
+@@ -10802,23 +10846,23 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8920
+ 		dAtA[i] = 0x1
8921
+ 		i++
8922
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size()))
8923
+-		n234, err := m.Quobyte.MarshalTo(dAtA[i:])
8924
++		n235, err := m.Quobyte.MarshalTo(dAtA[i:])
8925
+ 		if err != nil {
8926
+ 			return 0, err
8927
+ 		}
8928
+-		i += n234
8929
++		i += n235
8930
+ 	}
8931
+-	if m.AzureDisk != nil {
8932
++	if m.CascadeDisk != nil {
8933
+ 		dAtA[i] = 0xb2
8934
+ 		i++
8935
+ 		dAtA[i] = 0x1
8936
+ 		i++
8937
+-		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
8938
+-		n235, err := m.AzureDisk.MarshalTo(dAtA[i:])
8939
++		i = encodeVarintGenerated(dAtA, i, uint64(m.CascadeDisk.Size()))
8940
++		n236, err := m.CascadeDisk.MarshalTo(dAtA[i:])
8941
+ 		if err != nil {
8942
+ 			return 0, err
8943
+ 		}
8944
+-		i += n235
8945
++		i += n236
8946
+ 	}
8947
+ 	if m.PhotonPersistentDisk != nil {
8948
+ 		dAtA[i] = 0xba
8949
+@@ -10826,11 +10870,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8950
+ 		dAtA[i] = 0x1
8951
+ 		i++
8952
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size()))
8953
+-		n236, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:])
8954
++		n237, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:])
8955
+ 		if err != nil {
8956
+ 			return 0, err
8957
+ 		}
8958
+-		i += n236
8959
++		i += n237
8960
+ 	}
8961
+ 	if m.PortworxVolume != nil {
8962
+ 		dAtA[i] = 0xc2
8963
+@@ -10838,11 +10882,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8964
+ 		dAtA[i] = 0x1
8965
+ 		i++
8966
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size()))
8967
+-		n237, err := m.PortworxVolume.MarshalTo(dAtA[i:])
8968
++		n238, err := m.PortworxVolume.MarshalTo(dAtA[i:])
8969
+ 		if err != nil {
8970
+ 			return 0, err
8971
+ 		}
8972
+-		i += n237
8973
++		i += n238
8974
+ 	}
8975
+ 	if m.ScaleIO != nil {
8976
+ 		dAtA[i] = 0xca
8977
+@@ -10850,11 +10894,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8978
+ 		dAtA[i] = 0x1
8979
+ 		i++
8980
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size()))
8981
+-		n238, err := m.ScaleIO.MarshalTo(dAtA[i:])
8982
++		n239, err := m.ScaleIO.MarshalTo(dAtA[i:])
8983
+ 		if err != nil {
8984
+ 			return 0, err
8985
+ 		}
8986
+-		i += n238
8987
++		i += n239
8988
+ 	}
8989
+ 	if m.Projected != nil {
8990
+ 		dAtA[i] = 0xd2
8991
+@@ -10862,11 +10906,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
8992
+ 		dAtA[i] = 0x1
8993
+ 		i++
8994
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size()))
8995
+-		n239, err := m.Projected.MarshalTo(dAtA[i:])
8996
++		n240, err := m.Projected.MarshalTo(dAtA[i:])
8997
+ 		if err != nil {
8998
+ 			return 0, err
8999
+ 		}
9000
+-		i += n239
9001
++		i += n240
9002
+ 	}
9003
+ 	if m.StorageOS != nil {
9004
+ 		dAtA[i] = 0xda
9005
+@@ -10874,11 +10918,23 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) {
9006
+ 		dAtA[i] = 0x1
9007
+ 		i++
9008
+ 		i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size()))
9009
+-		n240, err := m.StorageOS.MarshalTo(dAtA[i:])
9010
++		n241, err := m.StorageOS.MarshalTo(dAtA[i:])
9011
+ 		if err != nil {
9012
+ 			return 0, err
9013
+ 		}
9014
+-		i += n240
9015
++		i += n241
9016
++	}
9017
++	if m.AzureDisk != nil {
9018
++		dAtA[i] = 0xe2
9019
++		i++
9020
++		dAtA[i] = 0x1
9021
++		i++
9022
++		i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size()))
9023
++		n242, err := m.AzureDisk.MarshalTo(dAtA[i:])
9024
++		if err != nil {
9025
++			return 0, err
9026
++		}
9027
++		i += n242
9028
+ 	}
9029
+ 	return i, nil
9030
+ }
9031
+@@ -11137,6 +11193,16 @@ func (m *Capabilities) Size() (n int) {
9032
+ 	return n
9033
+ }
9034
+ 
9035
++func (m *CascadeDiskVolumeSource) Size() (n int) {
9036
++	var l int
9037
++	_ = l
9038
++	l = len(m.DiskID)
9039
++	n += 1 + l + sovGenerated(uint64(l))
9040
++	l = len(m.FSType)
9041
++	n += 1 + l + sovGenerated(uint64(l))
9042
++	return n
9043
++}
9044
++
9045
+ func (m *CephFSPersistentVolumeSource) Size() (n int) {
9046
+ 	var l int
9047
+ 	_ = l
9048
+@@ -12854,8 +12920,8 @@ func (m *PersistentVolumeSource) Size() (n int) {
9049
+ 		l = m.Quobyte.Size()
9050
+ 		n += 1 + l + sovGenerated(uint64(l))
9051
+ 	}
9052
+-	if m.AzureDisk != nil {
9053
+-		l = m.AzureDisk.Size()
9054
++	if m.CascadeDisk != nil {
9055
++		l = m.CascadeDisk.Size()
9056
+ 		n += 2 + l + sovGenerated(uint64(l))
9057
+ 	}
9058
+ 	if m.PhotonPersistentDisk != nil {
9059
+@@ -12882,6 +12948,10 @@ func (m *PersistentVolumeSource) Size() (n int) {
9060
+ 		l = m.CSI.Size()
9061
+ 		n += 2 + l + sovGenerated(uint64(l))
9062
+ 	}
9063
++	if m.AzureDisk != nil {
9064
++		l = m.AzureDisk.Size()
9065
++		n += 2 + l + sovGenerated(uint64(l))
9066
++	}
9067
+ 	return n
9068
+ }
9069
+ 
9070
+@@ -14453,8 +14523,8 @@ func (m *VolumeSource) Size() (n int) {
9071
+ 		l = m.Quobyte.Size()
9072
+ 		n += 2 + l + sovGenerated(uint64(l))
9073
+ 	}
9074
+-	if m.AzureDisk != nil {
9075
+-		l = m.AzureDisk.Size()
9076
++	if m.CascadeDisk != nil {
9077
++		l = m.CascadeDisk.Size()
9078
+ 		n += 2 + l + sovGenerated(uint64(l))
9079
+ 	}
9080
+ 	if m.PhotonPersistentDisk != nil {
9081
+@@ -14477,6 +14547,10 @@ func (m *VolumeSource) Size() (n int) {
9082
+ 		l = m.StorageOS.Size()
9083
+ 		n += 2 + l + sovGenerated(uint64(l))
9084
+ 	}
9085
++	if m.AzureDisk != nil {
9086
++		l = m.AzureDisk.Size()
9087
++		n += 2 + l + sovGenerated(uint64(l))
9088
++	}
9089
+ 	return n
9090
+ }
9091
+ 
9092
+@@ -14651,6 +14725,17 @@ func (this *Capabilities) String() string {
9093
+ 	}, "")
9094
+ 	return s
9095
+ }
9096
++func (this *CascadeDiskVolumeSource) String() string {
9097
++	if this == nil {
9098
++		return "nil"
9099
++	}
9100
++	s := strings.Join([]string{`&CascadeDiskVolumeSource{`,
9101
++		`DiskID:` + fmt.Sprintf("%v", this.DiskID) + `,`,
9102
++		`FSType:` + fmt.Sprintf("%v", this.FSType) + `,`,
9103
++		`}`,
9104
++	}, "")
9105
++	return s
9106
++}
9107
+ func (this *CephFSPersistentVolumeSource) String() string {
9108
+ 	if this == nil {
9109
+ 		return "nil"
9110
+@@ -16022,13 +16107,14 @@ func (this *PersistentVolumeSource) String() string {
9111
+ 		`AzureFile:` + strings.Replace(fmt.Sprintf("%v", this.AzureFile), "AzureFilePersistentVolumeSource", "AzureFilePersistentVolumeSource", 1) + `,`,
9112
+ 		`VsphereVolume:` + strings.Replace(fmt.Sprintf("%v", this.VsphereVolume), "VsphereVirtualDiskVolumeSource", "VsphereVirtualDiskVolumeSource", 1) + `,`,
9113
+ 		`Quobyte:` + strings.Replace(fmt.Sprintf("%v", this.Quobyte), "QuobyteVolumeSource", "QuobyteVolumeSource", 1) + `,`,
9114
+-		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
9115
++		`CascadeDisk:` + strings.Replace(fmt.Sprintf("%v", this.CascadeDisk), "CascadeDiskVolumeSource", "CascadeDiskVolumeSource", 1) + `,`,
9116
+ 		`PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`,
9117
+ 		`PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`,
9118
+ 		`ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOPersistentVolumeSource", "ScaleIOPersistentVolumeSource", 1) + `,`,
9119
+ 		`Local:` + strings.Replace(fmt.Sprintf("%v", this.Local), "LocalVolumeSource", "LocalVolumeSource", 1) + `,`,
9120
+ 		`StorageOS:` + strings.Replace(fmt.Sprintf("%v", this.StorageOS), "StorageOSPersistentVolumeSource", "StorageOSPersistentVolumeSource", 1) + `,`,
9121
+ 		`CSI:` + strings.Replace(fmt.Sprintf("%v", this.CSI), "CSIPersistentVolumeSource", "CSIPersistentVolumeSource", 1) + `,`,
9122
++		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
9123
+ 		`}`,
9124
+ 	}, "")
9125
+ 	return s
9126
+@@ -17253,12 +17339,13 @@ func (this *VolumeSource) String() string {
9127
+ 		`ConfigMap:` + strings.Replace(fmt.Sprintf("%v", this.ConfigMap), "ConfigMapVolumeSource", "ConfigMapVolumeSource", 1) + `,`,
9128
+ 		`VsphereVolume:` + strings.Replace(fmt.Sprintf("%v", this.VsphereVolume), "VsphereVirtualDiskVolumeSource", "VsphereVirtualDiskVolumeSource", 1) + `,`,
9129
+ 		`Quobyte:` + strings.Replace(fmt.Sprintf("%v", this.Quobyte), "QuobyteVolumeSource", "QuobyteVolumeSource", 1) + `,`,
9130
+-		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
9131
++		`CascadeDisk:` + strings.Replace(fmt.Sprintf("%v", this.CascadeDisk), "CascadeDiskVolumeSource", "CascadeDiskVolumeSource", 1) + `,`,
9132
+ 		`PhotonPersistentDisk:` + strings.Replace(fmt.Sprintf("%v", this.PhotonPersistentDisk), "PhotonPersistentDiskVolumeSource", "PhotonPersistentDiskVolumeSource", 1) + `,`,
9133
+ 		`PortworxVolume:` + strings.Replace(fmt.Sprintf("%v", this.PortworxVolume), "PortworxVolumeSource", "PortworxVolumeSource", 1) + `,`,
9134
+ 		`ScaleIO:` + strings.Replace(fmt.Sprintf("%v", this.ScaleIO), "ScaleIOVolumeSource", "ScaleIOVolumeSource", 1) + `,`,
9135
+ 		`Projected:` + strings.Replace(fmt.Sprintf("%v", this.Projected), "ProjectedVolumeSource", "ProjectedVolumeSource", 1) + `,`,
9136
+ 		`StorageOS:` + strings.Replace(fmt.Sprintf("%v", this.StorageOS), "StorageOSVolumeSource", "StorageOSVolumeSource", 1) + `,`,
9137
++		`AzureDisk:` + strings.Replace(fmt.Sprintf("%v", this.AzureDisk), "AzureDiskVolumeSource", "AzureDiskVolumeSource", 1) + `,`,
9138
+ 		`}`,
9139
+ 	}, "")
9140
+ 	return s
9141
+@@ -18875,6 +18962,114 @@ func (m *Capabilities) Unmarshal(dAtA []byte) error {
9142
+ 	}
9143
+ 	return nil
9144
+ }
9145
++func (m *CascadeDiskVolumeSource) Unmarshal(dAtA []byte) error {
9146
++	l := len(dAtA)
9147
++	iNdEx := 0
9148
++	for iNdEx < l {
9149
++		preIndex := iNdEx
9150
++		var wire uint64
9151
++		for shift := uint(0); ; shift += 7 {
9152
++			if shift >= 64 {
9153
++				return ErrIntOverflowGenerated
9154
++			}
9155
++			if iNdEx >= l {
9156
++				return io.ErrUnexpectedEOF
9157
++			}
9158
++			b := dAtA[iNdEx]
9159
++			iNdEx++
9160
++			wire |= (uint64(b) & 0x7F) << shift
9161
++			if b < 0x80 {
9162
++				break
9163
++			}
9164
++		}
9165
++		fieldNum := int32(wire >> 3)
9166
++		wireType := int(wire & 0x7)
9167
++		if wireType == 4 {
9168
++			return fmt.Errorf("proto: CascadeDiskVolumeSource: wiretype end group for non-group")
9169
++		}
9170
++		if fieldNum <= 0 {
9171
++			return fmt.Errorf("proto: CascadeDiskVolumeSource: illegal tag %d (wire type %d)", fieldNum, wire)
9172
++		}
9173
++		switch fieldNum {
9174
++		case 1:
9175
++			if wireType != 2 {
9176
++				return fmt.Errorf("proto: wrong wireType = %d for field DiskID", wireType)
9177
++			}
9178
++			var stringLen uint64
9179
++			for shift := uint(0); ; shift += 7 {
9180
++				if shift >= 64 {
9181
++					return ErrIntOverflowGenerated
9182
++				}
9183
++				if iNdEx >= l {
9184
++					return io.ErrUnexpectedEOF
9185
++				}
9186
++				b := dAtA[iNdEx]
9187
++				iNdEx++
9188
++				stringLen |= (uint64(b) & 0x7F) << shift
9189
++				if b < 0x80 {
9190
++					break
9191
++				}
9192
++			}
9193
++			intStringLen := int(stringLen)
9194
++			if intStringLen < 0 {
9195
++				return ErrInvalidLengthGenerated
9196
++			}
9197
++			postIndex := iNdEx + intStringLen
9198
++			if postIndex > l {
9199
++				return io.ErrUnexpectedEOF
9200
++			}
9201
++			m.DiskID = string(dAtA[iNdEx:postIndex])
9202
++			iNdEx = postIndex
9203
++		case 2:
9204
++			if wireType != 2 {
9205
++				return fmt.Errorf("proto: wrong wireType = %d for field FSType", wireType)
9206
++			}
9207
++			var stringLen uint64
9208
++			for shift := uint(0); ; shift += 7 {
9209
++				if shift >= 64 {
9210
++					return ErrIntOverflowGenerated
9211
++				}
9212
++				if iNdEx >= l {
9213
++					return io.ErrUnexpectedEOF
9214
++				}
9215
++				b := dAtA[iNdEx]
9216
++				iNdEx++
9217
++				stringLen |= (uint64(b) & 0x7F) << shift
9218
++				if b < 0x80 {
9219
++					break
9220
++				}
9221
++			}
9222
++			intStringLen := int(stringLen)
9223
++			if intStringLen < 0 {
9224
++				return ErrInvalidLengthGenerated
9225
++			}
9226
++			postIndex := iNdEx + intStringLen
9227
++			if postIndex > l {
9228
++				return io.ErrUnexpectedEOF
9229
++			}
9230
++			m.FSType = string(dAtA[iNdEx:postIndex])
9231
++			iNdEx = postIndex
9232
++		default:
9233
++			iNdEx = preIndex
9234
++			skippy, err := skipGenerated(dAtA[iNdEx:])
9235
++			if err != nil {
9236
++				return err
9237
++			}
9238
++			if skippy < 0 {
9239
++				return ErrInvalidLengthGenerated
9240
++			}
9241
++			if (iNdEx + skippy) > l {
9242
++				return io.ErrUnexpectedEOF
9243
++			}
9244
++			iNdEx += skippy
9245
++		}
9246
++	}
9247
++
9248
++	if iNdEx > l {
9249
++		return io.ErrUnexpectedEOF
9250
++	}
9251
++	return nil
9252
++}
9253
+ func (m *CephFSPersistentVolumeSource) Unmarshal(dAtA []byte) error {
9254
+ 	l := len(dAtA)
9255
+ 	iNdEx := 0
9256
+@@ -35408,7 +35603,7 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error {
9257
+ 			iNdEx = postIndex
9258
+ 		case 16:
9259
+ 			if wireType != 2 {
9260
+-				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
9261
++				return fmt.Errorf("proto: wrong wireType = %d for field CascadeDisk", wireType)
9262
+ 			}
9263
+ 			var msglen int
9264
+ 			for shift := uint(0); ; shift += 7 {
9265
+@@ -35432,10 +35627,10 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error {
9266
+ 			if postIndex > l {
9267
+ 				return io.ErrUnexpectedEOF
9268
+ 			}
9269
+-			if m.AzureDisk == nil {
9270
+-				m.AzureDisk = &AzureDiskVolumeSource{}
9271
++			if m.CascadeDisk == nil {
9272
++				m.CascadeDisk = &CascadeDiskVolumeSource{}
9273
+ 			}
9274
+-			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
9275
++			if err := m.CascadeDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
9276
+ 				return err
9277
+ 			}
9278
+ 			iNdEx = postIndex
9279
+@@ -35637,6 +35832,39 @@ func (m *PersistentVolumeSource) Unmarshal(dAtA []byte) error {
9280
+ 				return err
9281
+ 			}
9282
+ 			iNdEx = postIndex
9283
++		case 23:
9284
++			if wireType != 2 {
9285
++				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
9286
++			}
9287
++			var msglen int
9288
++			for shift := uint(0); ; shift += 7 {
9289
++				if shift >= 64 {
9290
++					return ErrIntOverflowGenerated
9291
++				}
9292
++				if iNdEx >= l {
9293
++					return io.ErrUnexpectedEOF
9294
++				}
9295
++				b := dAtA[iNdEx]
9296
++				iNdEx++
9297
++				msglen |= (int(b) & 0x7F) << shift
9298
++				if b < 0x80 {
9299
++					break
9300
++				}
9301
++			}
9302
++			if msglen < 0 {
9303
++				return ErrInvalidLengthGenerated
9304
++			}
9305
++			postIndex := iNdEx + msglen
9306
++			if postIndex > l {
9307
++				return io.ErrUnexpectedEOF
9308
++			}
9309
++			if m.AzureDisk == nil {
9310
++				m.AzureDisk = &AzureDiskVolumeSource{}
9311
++			}
9312
++			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
9313
++				return err
9314
++			}
9315
++			iNdEx = postIndex
9316
+ 		default:
9317
+ 			iNdEx = preIndex
9318
+ 			skippy, err := skipGenerated(dAtA[iNdEx:])
9319
+@@ -49223,6 +49451,7 @@ func (m *TopologySelectorTerm) Unmarshal(dAtA []byte) error {
9320
+ 	}
9321
+ 	return nil
9322
+ }
9323
++
9324
+ func (m *TypedLocalObjectReference) Unmarshal(dAtA []byte) error {
9325
+ 	l := len(dAtA)
9326
+ 	iNdEx := 0
9327
+@@ -49361,6 +49590,7 @@ func (m *TypedLocalObjectReference) Unmarshal(dAtA []byte) error {
9328
+ 	}
9329
+ 	return nil
9330
+ }
9331
++
9332
+ func (m *Volume) Unmarshal(dAtA []byte) error {
9333
+ 	l := len(dAtA)
9334
+ 	iNdEx := 0
9335
+@@ -50754,7 +50984,7 @@ func (m *VolumeSource) Unmarshal(dAtA []byte) error {
9336
+ 			iNdEx = postIndex
9337
+ 		case 22:
9338
+ 			if wireType != 2 {
9339
+-				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
9340
++				return fmt.Errorf("proto: wrong wireType = %d for field CascadeDisk", wireType)
9341
+ 			}
9342
+ 			var msglen int
9343
+ 			for shift := uint(0); ; shift += 7 {
9344
+@@ -50778,10 +51008,10 @@ func (m *VolumeSource) Unmarshal(dAtA []byte) error {
9345
+ 			if postIndex > l {
9346
+ 				return io.ErrUnexpectedEOF
9347
+ 			}
9348
+-			if m.AzureDisk == nil {
9349
+-				m.AzureDisk = &AzureDiskVolumeSource{}
9350
++			if m.CascadeDisk == nil {
9351
++				m.CascadeDisk = &CascadeDiskVolumeSource{}
9352
+ 			}
9353
+-			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
9354
++			if err := m.CascadeDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
9355
+ 				return err
9356
+ 			}
9357
+ 			iNdEx = postIndex
9358
+@@ -50950,6 +51180,39 @@ func (m *VolumeSource) Unmarshal(dAtA []byte) error {
9359
+ 				return err
9360
+ 			}
9361
+ 			iNdEx = postIndex
9362
++		case 28:
9363
++			if wireType != 2 {
9364
++				return fmt.Errorf("proto: wrong wireType = %d for field AzureDisk", wireType)
9365
++			}
9366
++			var msglen int
9367
++			for shift := uint(0); ; shift += 7 {
9368
++				if shift >= 64 {
9369
++					return ErrIntOverflowGenerated
9370
++				}
9371
++				if iNdEx >= l {
9372
++					return io.ErrUnexpectedEOF
9373
++				}
9374
++				b := dAtA[iNdEx]
9375
++				iNdEx++
9376
++				msglen |= (int(b) & 0x7F) << shift
9377
++				if b < 0x80 {
9378
++					break
9379
++				}
9380
++			}
9381
++			if msglen < 0 {
9382
++				return ErrInvalidLengthGenerated
9383
++			}
9384
++			postIndex := iNdEx + msglen
9385
++			if postIndex > l {
9386
++				return io.ErrUnexpectedEOF
9387
++			}
9388
++			if m.AzureDisk == nil {
9389
++				m.AzureDisk = &AzureDiskVolumeSource{}
9390
++			}
9391
++			if err := m.AzureDisk.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
9392
++				return err
9393
++			}
9394
++			iNdEx = postIndex
9395
+ 		default:
9396
+ 			iNdEx = preIndex
9397
+ 			skippy, err := skipGenerated(dAtA[iNdEx:])
9398
+@@ -51346,804 +51609,802 @@ func init() {
9399
+ }
9400
+ 
9401
+ var fileDescriptorGenerated = []byte{
9402
+-	// 12780 bytes of a gzipped FileDescriptorProto
9403
+-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x6c, 0x24, 0x47,
9404
+-	0x7a, 0xd8, 0xf5, 0xcc, 0x90, 0x9c, 0xf9, 0xf8, 0xae, 0x7d, 0x88, 0x4b, 0x69, 0x77, 0x56, 0xad,
9405
+-	0xbb, 0xd5, 0xea, 0x24, 0x91, 0xa7, 0x95, 0x74, 0x92, 0x4f, 0x3a, 0xd9, 0x24, 0x87, 0xdc, 0x1d,
9406
+-	0xed, 0x92, 0x3b, 0xaa, 0xe1, 0xee, 0xde, 0xc9, 0xba, 0xf3, 0x35, 0x67, 0x8a, 0x64, 0x8b, 0xc3,
9407
+-	0xee, 0x51, 0x77, 0x0f, 0x77, 0xa9, 0xd8, 0x40, 0x72, 0x8e, 0x9d, 0x5c, 0x6c, 0x04, 0x87, 0xd8,
9408
+-	0xc8, 0xc3, 0x36, 0x1c, 0xc0, 0x71, 0x60, 0x3b, 0x4e, 0x82, 0x38, 0x76, 0x6c, 0xc7, 0x67, 0x27,
9409
+-	0x8e, 0x9d, 0x1f, 0x0e, 0x10, 0x5c, 0x9c, 0x00, 0xc1, 0x19, 0x30, 0xc2, 0xd8, 0x74, 0x1e, 0xf0,
9410
+-	0x8f, 0x3c, 0x10, 0xe7, 0x47, 0xcc, 0x18, 0x71, 0x50, 0xcf, 0xae, 0xea, 0xe9, 0x9e, 0x19, 0xae,
9411
+-	0xb8, 0x94, 0x7c, 0xb8, 0x7f, 0x33, 0xf5, 0x7d, 0xf5, 0x55, 0x75, 0x3d, 0xbf, 0xef, 0xab, 0xef,
9412
+-	0x01, 0xaf, 0xed, 0xbc, 0x1a, 0xce, 0xb9, 0xfe, 0xfc, 0x4e, 0x67, 0x83, 0x04, 0x1e, 0x89, 0x48,
9413
+-	0x38, 0xbf, 0x47, 0xbc, 0xa6, 0x1f, 0xcc, 0x0b, 0x80, 0xd3, 0x76, 0xe7, 0x1b, 0x7e, 0x40, 0xe6,
9414
+-	0xf7, 0x5e, 0x98, 0xdf, 0x22, 0x1e, 0x09, 0x9c, 0x88, 0x34, 0xe7, 0xda, 0x81, 0x1f, 0xf9, 0x08,
9415
+-	0x71, 0x9c, 0x39, 0xa7, 0xed, 0xce, 0x51, 0x9c, 0xb9, 0xbd, 0x17, 0x66, 0x9f, 0xdf, 0x72, 0xa3,
9416
+-	0xed, 0xce, 0xc6, 0x5c, 0xc3, 0xdf, 0x9d, 0xdf, 0xf2, 0xb7, 0xfc, 0x79, 0x86, 0xba, 0xd1, 0xd9,
9417
+-	0x64, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x93, 0x98, 0x7d, 0x29, 0x6e, 0x66, 0xd7, 0x69, 0x6c, 0xbb,
9418
+-	0x1e, 0x09, 0xf6, 0xe7, 0xdb, 0x3b, 0x5b, 0xac, 0xdd, 0x80, 0x84, 0x7e, 0x27, 0x68, 0x90, 0x64,
9419
+-	0xc3, 0x3d, 0x6b, 0x85, 0xf3, 0xbb, 0x24, 0x72, 0x52, 0xba, 0x3b, 0x3b, 0x9f, 0x55, 0x2b, 0xe8,
9420
+-	0x78, 0x91, 0xbb, 0xdb, 0xdd, 0xcc, 0xa7, 0xfb, 0x55, 0x08, 0x1b, 0xdb, 0x64, 0xd7, 0xe9, 0xaa,
9421
+-	0xf7, 0x62, 0x56, 0xbd, 0x4e, 0xe4, 0xb6, 0xe6, 0x5d, 0x2f, 0x0a, 0xa3, 0x20, 0x59, 0xc9, 0xfe,
9422
+-	0x86, 0x05, 0x97, 0x17, 0xee, 0xd5, 0x97, 0x5b, 0x4e, 0x18, 0xb9, 0x8d, 0xc5, 0x96, 0xdf, 0xd8,
9423
+-	0xa9, 0x47, 0x7e, 0x40, 0xee, 0xfa, 0xad, 0xce, 0x2e, 0xa9, 0xb3, 0x81, 0x40, 0xcf, 0x41, 0x71,
9424
+-	0x8f, 0xfd, 0xaf, 0x56, 0x66, 0xac, 0xcb, 0xd6, 0xd5, 0xd2, 0xe2, 0xd4, 0x6f, 0x1d, 0x94, 0x3f,
9425
+-	0x76, 0x78, 0x50, 0x2e, 0xde, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0x2b, 0x30, 0xbc, 0x19, 0xae, 0xef,
9426
+-	0xb7, 0xc9, 0x4c, 0x8e, 0xe1, 0x4e, 0x08, 0xdc, 0xe1, 0x95, 0x3a, 0x2d, 0xc5, 0x02, 0x8a, 0xe6,
9427
+-	0xa1, 0xd4, 0x76, 0x82, 0xc8, 0x8d, 0x5c, 0xdf, 0x9b, 0xc9, 0x5f, 0xb6, 0xae, 0x0e, 0x2d, 0x4e,
9428
+-	0x0b, 0xd4, 0x52, 0x4d, 0x02, 0x70, 0x8c, 0x43, 0xbb, 0x11, 0x10, 0xa7, 0x79, 0xdb, 0x6b, 0xed,
9429
+-	0xcf, 0x14, 0x2e, 0x5b, 0x57, 0x8b, 0x71, 0x37, 0xb0, 0x28, 0xc7, 0x0a, 0xc3, 0xfe, 0x91, 0x1c,
9430
+-	0x14, 0x17, 0x36, 0x37, 0x5d, 0xcf, 0x8d, 0xf6, 0xd1, 0x5d, 0x18, 0xf3, 0xfc, 0x26, 0x91, 0xff,
9431
+-	0xd9, 0x57, 0x8c, 0x5e, 0xbb, 0x3c, 0xd7, 0xbd, 0x94, 0xe6, 0xd6, 0x34, 0xbc, 0xc5, 0xa9, 0xc3,
9432
+-	0x83, 0xf2, 0x98, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x68, 0xdb, 0x6f, 0x2a, 0xb2, 0x39, 0x46,
9433
+-	0xb6, 0x9c, 0x46, 0xb6, 0x16, 0xa3, 0x2d, 0x4e, 0x1e, 0x1e, 0x94, 0x47, 0xb5, 0x02, 0xac, 0x13,
9434
+-	0x41, 0x1b, 0x30, 0x49, 0xff, 0x7a, 0x91, 0xab, 0xe8, 0xe6, 0x19, 0xdd, 0xa7, 0xb2, 0xe8, 0x6a,
9435
+-	0xa8, 0x8b, 0x67, 0x0e, 0x0f, 0xca, 0x93, 0x89, 0x42, 0x9c, 0x24, 0x68, 0xbf, 0x0f, 0x13, 0x0b,
9436
+-	0x51, 0xe4, 0x34, 0xb6, 0x49, 0x93, 0xcf, 0x20, 0x7a, 0x09, 0x0a, 0x9e, 0xb3, 0x4b, 0xc4, 0xfc,
9437
+-	0x5e, 0x16, 0x03, 0x5b, 0x58, 0x73, 0x76, 0xc9, 0xd1, 0x41, 0x79, 0xea, 0x8e, 0xe7, 0xbe, 0xd7,
9438
+-	0x11, 0xab, 0x82, 0x96, 0x61, 0x86, 0x8d, 0xae, 0x01, 0x34, 0xc9, 0x9e, 0xdb, 0x20, 0x35, 0x27,
9439
+-	0xda, 0x16, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x28, 0x08, 0xd6, 0xb0, 0xec, 0x07, 0x50, 0x5a, 0xd8,
9440
+-	0xf3, 0xdd, 0x66, 0xcd, 0x6f, 0x86, 0x68, 0x07, 0x26, 0xdb, 0x01, 0xd9, 0x24, 0x81, 0x2a, 0x9a,
9441
+-	0xb1, 0x2e, 0xe7, 0xaf, 0x8e, 0x5e, 0xbb, 0x9a, 0xfa, 0xb1, 0x26, 0xea, 0xb2, 0x17, 0x05, 0xfb,
9442
+-	0x8b, 0x8f, 0x89, 0xf6, 0x26, 0x13, 0x50, 0x9c, 0xa4, 0x6c, 0xff, 0xcb, 0x1c, 0x9c, 0x5b, 0x78,
9443
+-	0xbf, 0x13, 0x90, 0x8a, 0x1b, 0xee, 0x24, 0x57, 0x78, 0xd3, 0x0d, 0x77, 0xd6, 0xe2, 0x11, 0x50,
9444
+-	0x4b, 0xab, 0x22, 0xca, 0xb1, 0xc2, 0x40, 0xcf, 0xc3, 0x08, 0xfd, 0x7d, 0x07, 0x57, 0xc5, 0x27,
9445
+-	0x9f, 0x11, 0xc8, 0xa3, 0x15, 0x27, 0x72, 0x2a, 0x1c, 0x84, 0x25, 0x0e, 0x5a, 0x85, 0xd1, 0x06,
9446
+-	0xdb, 0x90, 0x5b, 0xab, 0x7e, 0x93, 0xb0, 0xc9, 0x2c, 0x2d, 0x3e, 0x4b, 0xd1, 0x97, 0xe2, 0xe2,
9447
+-	0xa3, 0x83, 0xf2, 0x0c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, 0x7f, 0x15,
9448
+-	0x18, 0x25, 0x48, 0xd9, 0x5b, 0x57, 0xb5, 0xad, 0x32, 0xc4, 0xb6, 0xca, 0x58, 0xfa, 0x36, 0x41,
9449
+-	0x2f, 0x40, 0x61, 0xc7, 0xf5, 0x9a, 0x33, 0xc3, 0x8c, 0xd6, 0x45, 0x3a, 0xe7, 0x37, 0x5d, 0xaf,
9450
+-	0x79, 0x74, 0x50, 0x9e, 0x36, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xc8, 0x82, 0x32, 0x83,
9451
+-	0xad, 0xb8, 0x2d, 0x52, 0x23, 0x41, 0xe8, 0x86, 0x11, 0xf1, 0x22, 0x63, 0x40, 0xaf, 0x01, 0x84,
9452
+-	0xa4, 0x11, 0x90, 0x48, 0x1b, 0x52, 0xb5, 0x30, 0xea, 0x0a, 0x82, 0x35, 0x2c, 0x7a, 0x20, 0x84,
9453
+-	0xdb, 0x4e, 0xc0, 0xd6, 0x97, 0x18, 0x58, 0x75, 0x20, 0xd4, 0x25, 0x00, 0xc7, 0x38, 0xc6, 0x81,
9454
+-	0x90, 0xef, 0x77, 0x20, 0xa0, 0xcf, 0xc2, 0x64, 0xdc, 0x58, 0xd8, 0x76, 0x1a, 0x72, 0x00, 0xd9,
9455
+-	0x96, 0xa9, 0x9b, 0x20, 0x9c, 0xc4, 0xb5, 0xff, 0x9e, 0x25, 0x16, 0x0f, 0xfd, 0xea, 0x8f, 0xf8,
9456
+-	0xb7, 0xda, 0xbf, 0x6c, 0xc1, 0xc8, 0xa2, 0xeb, 0x35, 0x5d, 0x6f, 0x0b, 0x7d, 0x09, 0x8a, 0xf4,
9457
+-	0x6e, 0x6a, 0x3a, 0x91, 0x23, 0xce, 0xbd, 0x4f, 0x69, 0x7b, 0x4b, 0x5d, 0x15, 0x73, 0xed, 0x9d,
9458
+-	0x2d, 0x5a, 0x10, 0xce, 0x51, 0x6c, 0xba, 0xdb, 0x6e, 0x6f, 0xbc, 0x4b, 0x1a, 0xd1, 0x2a, 0x89,
9459
+-	0x9c, 0xf8, 0x73, 0xe2, 0x32, 0xac, 0xa8, 0xa2, 0x9b, 0x30, 0x1c, 0x39, 0xc1, 0x16, 0x89, 0xc4,
9460
+-	0x01, 0x98, 0x7a, 0x50, 0xf1, 0x9a, 0x98, 0xee, 0x48, 0xe2, 0x35, 0x48, 0x7c, 0x2d, 0xac, 0xb3,
9461
+-	0xaa, 0x58, 0x90, 0xb0, 0xff, 0xca, 0x30, 0x5c, 0x58, 0xaa, 0x57, 0x33, 0xd6, 0xd5, 0x15, 0x18,
9462
+-	0x6e, 0x06, 0xee, 0x1e, 0x09, 0xc4, 0x38, 0x2b, 0x2a, 0x15, 0x56, 0x8a, 0x05, 0x14, 0xbd, 0x0a,
9463
+-	0x63, 0xfc, 0x42, 0xba, 0xe1, 0x78, 0xcd, 0x96, 0x1c, 0xe2, 0xb3, 0x02, 0x7b, 0xec, 0xae, 0x06,
9464
+-	0xc3, 0x06, 0xe6, 0x31, 0x17, 0xd5, 0x95, 0xc4, 0x66, 0xcc, 0xba, 0xec, 0xbe, 0x62, 0xc1, 0x14,
9465
+-	0x6f, 0x66, 0x21, 0x8a, 0x02, 0x77, 0xa3, 0x13, 0x91, 0x70, 0x66, 0x88, 0x9d, 0x74, 0x4b, 0x69,
9466
+-	0xa3, 0x95, 0x39, 0x02, 0x73, 0x77, 0x13, 0x54, 0xf8, 0x21, 0x38, 0x23, 0xda, 0x9d, 0x4a, 0x82,
9467
+-	0x71, 0x57, 0xb3, 0xe8, 0x7b, 0x2d, 0x98, 0x6d, 0xf8, 0x5e, 0x14, 0xf8, 0xad, 0x16, 0x09, 0x6a,
9468
+-	0x9d, 0x8d, 0x96, 0x1b, 0x6e, 0xf3, 0x75, 0x8a, 0xc9, 0x26, 0x3b, 0x09, 0x32, 0xe6, 0x50, 0x21,
9469
+-	0x89, 0x39, 0xbc, 0x74, 0x78, 0x50, 0x9e, 0x5d, 0xca, 0x24, 0x85, 0x7b, 0x34, 0x83, 0x76, 0x00,
9470
+-	0xd1, 0xab, 0xb4, 0x1e, 0x39, 0x5b, 0x24, 0x6e, 0x7c, 0x64, 0xf0, 0xc6, 0xcf, 0x1f, 0x1e, 0x94,
9471
+-	0xd1, 0x5a, 0x17, 0x09, 0x9c, 0x42, 0x16, 0xbd, 0x07, 0x67, 0x69, 0x69, 0xd7, 0xb7, 0x16, 0x07,
9472
+-	0x6f, 0x6e, 0xe6, 0xf0, 0xa0, 0x7c, 0x76, 0x2d, 0x85, 0x08, 0x4e, 0x25, 0x3d, 0xbb, 0x04, 0xe7,
9473
+-	0x52, 0xa7, 0x0a, 0x4d, 0x41, 0x7e, 0x87, 0x70, 0x16, 0xa4, 0x84, 0xe9, 0x4f, 0x74, 0x16, 0x86,
9474
+-	0xf6, 0x9c, 0x56, 0x47, 0xac, 0x52, 0xcc, 0xff, 0x7c, 0x26, 0xf7, 0xaa, 0x65, 0x37, 0x60, 0x6c,
9475
+-	0xc9, 0x69, 0x3b, 0x1b, 0x6e, 0xcb, 0x8d, 0x5c, 0x12, 0xa2, 0xa7, 0x21, 0xef, 0x34, 0x9b, 0xec,
9476
+-	0x8a, 0x2c, 0x2d, 0x9e, 0x3b, 0x3c, 0x28, 0xe7, 0x17, 0x9a, 0xf4, 0xac, 0x06, 0x85, 0xb5, 0x8f,
9477
+-	0x29, 0x06, 0xfa, 0x24, 0x14, 0x9a, 0x81, 0xdf, 0x9e, 0xc9, 0x31, 0x4c, 0x3a, 0x54, 0x85, 0x4a,
9478
+-	0xe0, 0xb7, 0x13, 0xa8, 0x0c, 0xc7, 0xfe, 0xf5, 0x1c, 0x3c, 0xb1, 0x44, 0xda, 0xdb, 0x2b, 0xf5,
9479
+-	0x8c, 0x4d, 0x77, 0x15, 0x8a, 0xbb, 0xbe, 0xe7, 0x46, 0x7e, 0x10, 0x8a, 0xa6, 0xd9, 0x6d, 0xb2,
9480
+-	0x2a, 0xca, 0xb0, 0x82, 0xa2, 0xcb, 0x50, 0x68, 0xc7, 0x9c, 0xc0, 0x98, 0xe4, 0x22, 0x18, 0x0f,
9481
+-	0xc0, 0x20, 0x14, 0xa3, 0x13, 0x92, 0x40, 0xdc, 0x82, 0x0a, 0xe3, 0x4e, 0x48, 0x02, 0xcc, 0x20,
9482
+-	0xf1, 0x71, 0x4a, 0x0f, 0x5a, 0xb1, 0xad, 0x12, 0xc7, 0x29, 0x85, 0x60, 0x0d, 0x0b, 0xd5, 0xa0,
9483
+-	0x14, 0xaa, 0x49, 0x1d, 0x1a, 0x7c, 0x52, 0xc7, 0xd9, 0x79, 0xab, 0x66, 0x32, 0x26, 0x62, 0x1c,
9484
+-	0x03, 0xc3, 0x7d, 0xcf, 0xdb, 0xaf, 0xe5, 0x00, 0xf1, 0x21, 0xfc, 0x33, 0x36, 0x70, 0x77, 0xba,
9485
+-	0x07, 0x2e, 0x95, 0xf3, 0xba, 0xe5, 0x37, 0x9c, 0x56, 0xf2, 0x08, 0x3f, 0xa9, 0xd1, 0xfb, 0xdf,
9486
+-	0x16, 0x3c, 0xb1, 0xe4, 0x7a, 0x4d, 0x12, 0x64, 0x2c, 0xc0, 0x47, 0x23, 0x80, 0x1c, 0xef, 0xa4,
9487
+-	0x37, 0x96, 0x58, 0xe1, 0x04, 0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72, 0x1f,
9488
+-	0x7b, 0xa7, 0xfb, 0x63, 0x4f, 0x60, 0x59, 0xd8, 0xb7, 0x60, 0x62, 0xa9, 0xe5, 0x12, 0x2f, 0xaa,
9489
+-	0xd6, 0x96, 0x7c, 0x6f, 0xd3, 0xdd, 0x42, 0x9f, 0x81, 0x09, 0x2a, 0xd3, 0xfa, 0x9d, 0xa8, 0x4e,
9490
+-	0x1a, 0xbe, 0xc7, 0xd8, 0x7f, 0x2a, 0x09, 0xa2, 0xc3, 0x83, 0xf2, 0xc4, 0xba, 0x01, 0xc1, 0x09,
9491
+-	0x4c, 0xfb, 0x77, 0xe9, 0xf8, 0xf9, 0xbb, 0x6d, 0xdf, 0x23, 0x5e, 0xb4, 0xe4, 0x7b, 0x4d, 0x2e,
9492
+-	0x26, 0x7e, 0x06, 0x0a, 0x11, 0x1d, 0x0f, 0x3e, 0x76, 0x57, 0xe4, 0x46, 0xa1, 0xa3, 0x70, 0x74,
9493
+-	0x50, 0x3e, 0xdf, 0x5d, 0x83, 0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x86, 0xc3, 0xc8, 0x89, 0x3a,
9494
+-	0xa1, 0x18, 0xcd, 0x27, 0xe5, 0x68, 0xd6, 0x59, 0xe9, 0xd1, 0x41, 0x79, 0x52, 0x55, 0xe3, 0x45,
9495
+-	0x58, 0x54, 0x40, 0xcf, 0xc0, 0xc8, 0x2e, 0x09, 0x43, 0x67, 0x4b, 0x72, 0xf8, 0x93, 0xa2, 0xee,
9496
+-	0xc8, 0x2a, 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x82, 0x21, 0x12, 0x04, 0x7e, 0x20, 0xf6, 0xe8, 0xb8,
9497
+-	0x40, 0x1c, 0x5a, 0xa6, 0x85, 0x98, 0xc3, 0xec, 0x7f, 0x63, 0xc1, 0xa4, 0xea, 0x2b, 0x6f, 0xeb,
9498
+-	0x14, 0x58, 0xb9, 0xb7, 0x01, 0x1a, 0xf2, 0x03, 0x43, 0x76, 0x7b, 0x8c, 0x5e, 0xbb, 0x92, 0xca,
9499
+-	0xa0, 0x74, 0x0d, 0x63, 0x4c, 0x59, 0x15, 0x85, 0x58, 0xa3, 0x66, 0xff, 0x9a, 0x05, 0x67, 0x12,
9500
+-	0x5f, 0x74, 0xcb, 0x0d, 0x23, 0xf4, 0x4e, 0xd7, 0x57, 0xcd, 0x0d, 0xf6, 0x55, 0xb4, 0x36, 0xfb,
9501
+-	0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, 0x37, 0x60, 0xc8, 0x8d, 0xc8, 0xae, 0xfc, 0x98, 0xa7,
9502
+-	0x7a, 0x7e, 0x0c, 0xef, 0x55, 0x3c, 0x23, 0x55, 0x5a, 0x13, 0x73, 0x02, 0xf6, 0x0f, 0xe5, 0xa1,
9503
+-	0xc4, 0x97, 0xed, 0xaa, 0xd3, 0x3e, 0x85, 0xb9, 0xa8, 0x42, 0x81, 0x51, 0xe7, 0x1d, 0x7f, 0x3a,
9504
+-	0xbd, 0xe3, 0xa2, 0x3b, 0x73, 0x54, 0x4e, 0xe3, 0xac, 0xa0, 0xba, 0x1a, 0x68, 0x11, 0x66, 0x24,
9505
+-	0x90, 0x03, 0xb0, 0xe1, 0x7a, 0x4e, 0xb0, 0x4f, 0xcb, 0x66, 0xf2, 0x8c, 0xe0, 0xf3, 0xbd, 0x09,
9506
+-	0x2e, 0x2a, 0x7c, 0x4e, 0x56, 0xf5, 0x35, 0x06, 0x60, 0x8d, 0xe8, 0xec, 0x2b, 0x50, 0x52, 0xc8,
9507
+-	0xc7, 0xe1, 0x71, 0x66, 0x3f, 0x0b, 0x93, 0x89, 0xb6, 0xfa, 0x55, 0x1f, 0xd3, 0x59, 0xa4, 0x5f,
9508
+-	0x61, 0xa7, 0x80, 0xe8, 0xf5, 0xb2, 0xb7, 0x27, 0x4e, 0xd1, 0xf7, 0xe1, 0x6c, 0x2b, 0xe5, 0x70,
9509
+-	0x12, 0x53, 0x35, 0xf8, 0x61, 0xf6, 0x84, 0xf8, 0xec, 0xb3, 0x69, 0x50, 0x9c, 0xda, 0x06, 0xbd,
9510
+-	0xf6, 0xfd, 0x36, 0x5d, 0xf3, 0x4e, 0x8b, 0xf5, 0x57, 0x48, 0xdf, 0xb7, 0x45, 0x19, 0x56, 0x50,
9511
+-	0x7a, 0x84, 0x9d, 0x55, 0x9d, 0xbf, 0x49, 0xf6, 0xeb, 0xa4, 0x45, 0x1a, 0x91, 0x1f, 0x7c, 0xa8,
9512
+-	0xdd, 0xbf, 0xc8, 0x47, 0x9f, 0x9f, 0x80, 0xa3, 0x82, 0x40, 0xfe, 0x26, 0xd9, 0xe7, 0x53, 0xa1,
9513
+-	0x7f, 0x5d, 0xbe, 0xe7, 0xd7, 0xfd, 0x9c, 0x05, 0xe3, 0xea, 0xeb, 0x4e, 0x61, 0xab, 0x2f, 0x9a,
9514
+-	0x5b, 0xfd, 0x62, 0xcf, 0x05, 0x9e, 0xb1, 0xc9, 0xbf, 0x96, 0x83, 0x0b, 0x0a, 0x87, 0xb2, 0xfb,
9515
+-	0xfc, 0x8f, 0x58, 0x55, 0xf3, 0x50, 0xf2, 0x94, 0xf6, 0xc0, 0x32, 0xc5, 0xf6, 0x58, 0x77, 0x10,
9516
+-	0xe3, 0x50, 0xae, 0xcd, 0x8b, 0x45, 0xfc, 0x31, 0x5d, 0xad, 0x26, 0x54, 0x68, 0x8b, 0x90, 0xef,
9517
+-	0xb8, 0x4d, 0x71, 0x67, 0x7c, 0x4a, 0x8e, 0xf6, 0x9d, 0x6a, 0xe5, 0xe8, 0xa0, 0xfc, 0x64, 0x96,
9518
+-	0x4a, 0x97, 0x5e, 0x56, 0xe1, 0xdc, 0x9d, 0x6a, 0x05, 0xd3, 0xca, 0x68, 0x01, 0x26, 0xa5, 0xd6,
9519
+-	0xfa, 0x2e, 0xe5, 0xa0, 0x7c, 0x4f, 0x5c, 0x2d, 0x4a, 0x37, 0x86, 0x4d, 0x30, 0x4e, 0xe2, 0xa3,
9520
+-	0x0a, 0x4c, 0xed, 0x74, 0x36, 0x48, 0x8b, 0x44, 0xfc, 0x83, 0x6f, 0x12, 0xae, 0x39, 0x2a, 0xc5,
9521
+-	0xa2, 0xe5, 0xcd, 0x04, 0x1c, 0x77, 0xd5, 0xb0, 0xff, 0x94, 0x1d, 0xf1, 0x62, 0xf4, 0x6a, 0x81,
9522
+-	0x4f, 0x17, 0x16, 0xa5, 0xfe, 0x61, 0x2e, 0xe7, 0x41, 0x56, 0xc5, 0x4d, 0xb2, 0xbf, 0xee, 0x53,
9523
+-	0x66, 0x3b, 0x7d, 0x55, 0x18, 0x6b, 0xbe, 0xd0, 0x73, 0xcd, 0xff, 0x42, 0x0e, 0xce, 0xa9, 0x11,
9524
+-	0x30, 0xf8, 0xba, 0x3f, 0xeb, 0x63, 0xf0, 0x02, 0x8c, 0x36, 0xc9, 0xa6, 0xd3, 0x69, 0x45, 0x4a,
9525
+-	0x8d, 0x39, 0xc4, 0x55, 0xd9, 0x95, 0xb8, 0x18, 0xeb, 0x38, 0xc7, 0x18, 0xb6, 0x9f, 0x1c, 0x65,
9526
+-	0x77, 0x6b, 0xe4, 0xd0, 0x35, 0xae, 0x76, 0x8d, 0x95, 0xb9, 0x6b, 0x9e, 0x82, 0x21, 0x77, 0x97,
9527
+-	0xf2, 0x5a, 0x39, 0x93, 0x85, 0xaa, 0xd2, 0x42, 0xcc, 0x61, 0xe8, 0x13, 0x30, 0xd2, 0xf0, 0x77,
9528
+-	0x77, 0x1d, 0xaf, 0xc9, 0xae, 0xbc, 0xd2, 0xe2, 0x28, 0x65, 0xc7, 0x96, 0x78, 0x11, 0x96, 0x30,
9529
+-	0xf4, 0x04, 0x14, 0x9c, 0x60, 0x2b, 0x9c, 0x29, 0x30, 0x9c, 0x22, 0x6d, 0x69, 0x21, 0xd8, 0x0a,
9530
+-	0x31, 0x2b, 0xa5, 0x52, 0xd5, 0x7d, 0x3f, 0xd8, 0x71, 0xbd, 0xad, 0x8a, 0x1b, 0x88, 0x2d, 0xa1,
9531
+-	0xee, 0xc2, 0x7b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x02, 0x43, 0x6d, 0x3f, 0x88, 0xc2, 0x99, 0x61,
9532
+-	0x36, 0xdc, 0x4f, 0x66, 0x1c, 0x44, 0xfc, 0x6b, 0x6b, 0x7e, 0x10, 0xc5, 0x1f, 0x40, 0xff, 0x85,
9533
+-	0x98, 0x57, 0x47, 0xdf, 0x06, 0x79, 0xe2, 0xed, 0xcd, 0x8c, 0x30, 0x2a, 0xb3, 0x69, 0x54, 0x96,
9534
+-	0xbd, 0xbd, 0xbb, 0x4e, 0x10, 0x9f, 0xd2, 0xcb, 0xde, 0x1e, 0xa6, 0x75, 0xd0, 0xe7, 0xa1, 0x24,
9535
+-	0xb7, 0x78, 0x28, 0xd4, 0x1c, 0xa9, 0x4b, 0x4c, 0x1e, 0x0c, 0x98, 0xbc, 0xd7, 0x71, 0x03, 0xb2,
9536
+-	0x4b, 0xbc, 0x28, 0x8c, 0xcf, 0x34, 0x09, 0x0d, 0x71, 0x4c, 0x0d, 0x7d, 0x5e, 0xea, 0xd6, 0x56,
9537
+-	0xfd, 0x8e, 0x17, 0x85, 0x33, 0x25, 0xd6, 0xbd, 0xd4, 0x57, 0x8f, 0xbb, 0x31, 0x5e, 0x52, 0xf9,
9538
+-	0xc6, 0x2b, 0x63, 0x83, 0x14, 0xc2, 0x30, 0xde, 0x72, 0xf7, 0x88, 0x47, 0xc2, 0xb0, 0x16, 0xf8,
9539
+-	0x1b, 0x64, 0x06, 0x58, 0xcf, 0x2f, 0xa4, 0x3f, 0x06, 0xf8, 0x1b, 0x64, 0x71, 0xfa, 0xf0, 0xa0,
9540
+-	0x3c, 0x7e, 0x4b, 0xaf, 0x83, 0x4d, 0x12, 0xe8, 0x0e, 0x4c, 0x50, 0xb9, 0xc6, 0x8d, 0x89, 0x8e,
9541
+-	0xf6, 0x23, 0xca, 0xa4, 0x0f, 0x6c, 0x54, 0xc2, 0x09, 0x22, 0xe8, 0x4d, 0x28, 0xb5, 0xdc, 0x4d,
9542
+-	0xd2, 0xd8, 0x6f, 0xb4, 0xc8, 0xcc, 0x18, 0xa3, 0x98, 0xba, 0xad, 0x6e, 0x49, 0x24, 0x2e, 0x17,
9543
+-	0xa9, 0xbf, 0x38, 0xae, 0x8e, 0xee, 0xc2, 0xf9, 0x88, 0x04, 0xbb, 0xae, 0xe7, 0xd0, 0xed, 0x20,
9544
+-	0xe4, 0x05, 0xf6, 0xa4, 0x32, 0xce, 0xd6, 0xdb, 0x25, 0x31, 0x74, 0xe7, 0xd7, 0x53, 0xb1, 0x70,
9545
+-	0x46, 0x6d, 0x74, 0x1b, 0x26, 0xd9, 0x4e, 0xa8, 0x75, 0x5a, 0xad, 0x9a, 0xdf, 0x72, 0x1b, 0xfb,
9546
+-	0x33, 0x13, 0x8c, 0xe0, 0x27, 0xe4, 0xbd, 0x50, 0x35, 0xc1, 0x47, 0x07, 0x65, 0x88, 0xff, 0xe1,
9547
+-	0x64, 0x6d, 0xb4, 0xc1, 0x74, 0xe8, 0x9d, 0xc0, 0x8d, 0xf6, 0xe9, 0xfa, 0x25, 0x0f, 0xa2, 0x99,
9548
+-	0xc9, 0x9e, 0xa2, 0xb0, 0x8e, 0xaa, 0x14, 0xed, 0x7a, 0x21, 0x4e, 0x12, 0xa4, 0x5b, 0x3b, 0x8c,
9549
+-	0x9a, 0xae, 0x37, 0x33, 0xc5, 0x4e, 0x0c, 0xb5, 0x33, 0xea, 0xb4, 0x10, 0x73, 0x18, 0xd3, 0x9f,
9550
+-	0xd3, 0x1f, 0xb7, 0xe9, 0x09, 0x3a, 0xcd, 0x10, 0x63, 0xfd, 0xb9, 0x04, 0xe0, 0x18, 0x87, 0x32,
9551
+-	0x35, 0x51, 0xb4, 0x3f, 0x83, 0x18, 0xaa, 0xda, 0x2e, 0xeb, 0xeb, 0x9f, 0xc7, 0xb4, 0x1c, 0xdd,
9552
+-	0x82, 0x11, 0xe2, 0xed, 0xad, 0x04, 0xfe, 0xee, 0xcc, 0x99, 0xec, 0x3d, 0xbb, 0xcc, 0x51, 0xf8,
9553
+-	0x81, 0x1e, 0x0b, 0x78, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0x01, 0xcc, 0xa4, 0xcc, 0x08, 0x9f, 0x80,
9554
+-	0xb3, 0x6c, 0x02, 0x5e, 0x17, 0x75, 0x67, 0xd6, 0x33, 0xf0, 0x8e, 0x7a, 0xc0, 0x70, 0x26, 0x75,
9555
+-	0xf4, 0x05, 0x18, 0xe7, 0x1b, 0x8a, 0x3f, 0xbe, 0x85, 0x33, 0xe7, 0xd8, 0xd7, 0x5c, 0xce, 0xde,
9556
+-	0x9c, 0x1c, 0x71, 0xf1, 0x9c, 0xe8, 0xd0, 0xb8, 0x5e, 0x1a, 0x62, 0x93, 0x9a, 0xbd, 0x01, 0x13,
9557
+-	0xea, 0xdc, 0x62, 0x4b, 0x07, 0x95, 0x61, 0x88, 0x71, 0x3b, 0x42, 0xbf, 0x55, 0xa2, 0x33, 0xc5,
9558
+-	0x38, 0x21, 0xcc, 0xcb, 0xd9, 0x4c, 0xb9, 0xef, 0x93, 0xc5, 0xfd, 0x88, 0x70, 0xa9, 0x3a, 0xaf,
9559
+-	0xcd, 0x94, 0x04, 0xe0, 0x18, 0xc7, 0xfe, 0x7f, 0x9c, 0x6b, 0x8c, 0x0f, 0xc7, 0x01, 0xae, 0x83,
9560
+-	0xe7, 0xa0, 0xb8, 0xed, 0x87, 0x11, 0xc5, 0x66, 0x6d, 0x0c, 0xc5, 0x7c, 0xe2, 0x0d, 0x51, 0x8e,
9561
+-	0x15, 0x06, 0x7a, 0x0d, 0xc6, 0x1b, 0x7a, 0x03, 0xe2, 0x2e, 0x53, 0x43, 0x60, 0xb4, 0x8e, 0x4d,
9562
+-	0x5c, 0xf4, 0x2a, 0x14, 0xd9, 0xd3, 0x79, 0xc3, 0x6f, 0x09, 0x26, 0x4b, 0x5e, 0xc8, 0xc5, 0x9a,
9563
+-	0x28, 0x3f, 0xd2, 0x7e, 0x63, 0x85, 0x8d, 0xae, 0xc0, 0x30, 0xed, 0x42, 0xb5, 0x26, 0x6e, 0x11,
9564
+-	0xa5, 0xaa, 0xb9, 0xc1, 0x4a, 0xb1, 0x80, 0xda, 0x7f, 0x2d, 0xa7, 0x8d, 0x32, 0x95, 0x48, 0x09,
9565
+-	0xaa, 0xc1, 0xc8, 0x7d, 0xc7, 0x8d, 0x5c, 0x6f, 0x4b, 0xb0, 0x0b, 0xcf, 0xf4, 0xbc, 0x52, 0x58,
9566
+-	0xa5, 0x7b, 0xbc, 0x02, 0xbf, 0xf4, 0xc4, 0x1f, 0x2c, 0xc9, 0x50, 0x8a, 0x41, 0xc7, 0xf3, 0x28,
9567
+-	0xc5, 0xdc, 0xa0, 0x14, 0x31, 0xaf, 0xc0, 0x29, 0x8a, 0x3f, 0x58, 0x92, 0x41, 0xef, 0x00, 0xc8,
9568
+-	0x65, 0x49, 0x9a, 0xe2, 0xc9, 0xfa, 0xb9, 0xfe, 0x44, 0xd7, 0x55, 0x9d, 0xc5, 0x09, 0x7a, 0xa5,
9569
+-	0xc6, 0xff, 0xb1, 0x46, 0xcf, 0x8e, 0x18, 0x5b, 0xd5, 0xdd, 0x19, 0xf4, 0x9d, 0xf4, 0x24, 0x70,
9570
+-	0x82, 0x88, 0x34, 0x17, 0x22, 0x31, 0x38, 0x9f, 0x1c, 0x4c, 0xa6, 0x58, 0x77, 0x77, 0x89, 0x7e,
9571
+-	0x6a, 0x08, 0x22, 0x38, 0xa6, 0x67, 0xff, 0x52, 0x1e, 0x66, 0xb2, 0xba, 0x4b, 0x17, 0x1d, 0x79,
9572
+-	0xe0, 0x46, 0x4b, 0x94, 0x1b, 0xb2, 0xcc, 0x45, 0xb7, 0x2c, 0xca, 0xb1, 0xc2, 0xa0, 0xb3, 0x1f,
9573
+-	0xba, 0x5b, 0x52, 0x24, 0x1c, 0x8a, 0x67, 0xbf, 0xce, 0x4a, 0xb1, 0x80, 0x52, 0xbc, 0x80, 0x38,
9574
+-	0xa1, 0xb0, 0x89, 0xd0, 0x56, 0x09, 0x66, 0xa5, 0x58, 0x40, 0x75, 0x7d, 0x53, 0xa1, 0x8f, 0xbe,
9575
+-	0xc9, 0x18, 0xa2, 0xa1, 0x93, 0x1d, 0x22, 0xf4, 0x45, 0x80, 0x4d, 0xd7, 0x73, 0xc3, 0x6d, 0x46,
9576
+-	0x7d, 0xf8, 0xd8, 0xd4, 0x15, 0x2f, 0xb5, 0xa2, 0xa8, 0x60, 0x8d, 0x22, 0x7a, 0x19, 0x46, 0xd5,
9577
+-	0x06, 0xac, 0x56, 0xd8, 0x03, 0x91, 0xf6, 0xe0, 0x1e, 0x9f, 0x46, 0x15, 0xac, 0xe3, 0xd9, 0xef,
9578
+-	0x26, 0xd7, 0x8b, 0xd8, 0x01, 0xda, 0xf8, 0x5a, 0x83, 0x8e, 0x6f, 0xae, 0xf7, 0xf8, 0xda, 0xbf,
9579
+-	0x91, 0x87, 0x49, 0xa3, 0xb1, 0x4e, 0x38, 0xc0, 0x99, 0x75, 0x9d, 0xde, 0x73, 0x4e, 0x44, 0xc4,
9580
+-	0xfe, 0xb3, 0xfb, 0x6f, 0x15, 0xfd, 0x2e, 0xa4, 0x3b, 0x80, 0xd7, 0x47, 0x5f, 0x84, 0x52, 0xcb,
9581
+-	0x09, 0x99, 0xee, 0x8a, 0x88, 0x7d, 0x37, 0x08, 0xb1, 0x58, 0x8e, 0x70, 0xc2, 0x48, 0xbb, 0x6a,
9582
+-	0x38, 0xed, 0x98, 0x24, 0xbd, 0x90, 0x29, 0xef, 0x23, 0x8d, 0x6e, 0x54, 0x27, 0x28, 0x83, 0xb4,
9583
+-	0x8f, 0x39, 0x0c, 0xbd, 0x0a, 0x63, 0x01, 0x61, 0xab, 0x62, 0x89, 0xb2, 0x72, 0x6c, 0x99, 0x0d,
9584
+-	0xc5, 0x3c, 0x1f, 0xd6, 0x60, 0xd8, 0xc0, 0x8c, 0x59, 0xf9, 0xe1, 0x1e, 0xac, 0xfc, 0x33, 0x30,
9585
+-	0xc2, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0xa3, 0xca, 0x8b, 0xb1, 0x84, 0x27, 0x17, 0x4c, 0x71, 0xc0,
9586
+-	0x05, 0xf3, 0x49, 0x98, 0xa8, 0x38, 0x64, 0xd7, 0xf7, 0x96, 0xbd, 0x66, 0xdb, 0x77, 0xbd, 0x08,
9587
+-	0xcd, 0x40, 0x81, 0xdd, 0x0e, 0x7c, 0x6f, 0x17, 0x28, 0x05, 0x5c, 0xa0, 0x8c, 0xb9, 0xbd, 0x05,
9588
+-	0xe7, 0x2a, 0xfe, 0x7d, 0xef, 0xbe, 0x13, 0x34, 0x17, 0x6a, 0x55, 0x4d, 0xce, 0x5d, 0x93, 0x72,
9589
+-	0x16, 0x37, 0x62, 0x49, 0x3d, 0x53, 0xb5, 0x9a, 0xfc, 0xae, 0x5d, 0x71, 0x5b, 0x24, 0x43, 0x1b,
9590
+-	0xf1, 0x37, 0x72, 0x46, 0x4b, 0x31, 0xbe, 0x7a, 0x30, 0xb2, 0x32, 0x1f, 0x8c, 0xde, 0x82, 0xe2,
9591
+-	0xa6, 0x4b, 0x5a, 0x4d, 0x4c, 0x36, 0xc5, 0x12, 0x7b, 0x3a, 0xfb, 0x5d, 0x7e, 0x85, 0x62, 0x4a,
9592
+-	0xed, 0x13, 0x97, 0xd2, 0x56, 0x44, 0x65, 0xac, 0xc8, 0xa0, 0x1d, 0x98, 0x92, 0x62, 0x80, 0x84,
9593
+-	0x8a, 0x05, 0xf7, 0x4c, 0x2f, 0xd9, 0xc2, 0x24, 0x7e, 0xf6, 0xf0, 0xa0, 0x3c, 0x85, 0x13, 0x64,
9594
+-	0x70, 0x17, 0x61, 0x2a, 0x96, 0xed, 0xd2, 0xa3, 0xb5, 0xc0, 0x86, 0x9f, 0x89, 0x65, 0x4c, 0xc2,
9595
+-	0x64, 0xa5, 0xf6, 0x8f, 0x59, 0xf0, 0x58, 0xd7, 0xc8, 0x08, 0x49, 0xfb, 0x84, 0x67, 0x21, 0x29,
9596
+-	0xf9, 0xe6, 0xfa, 0x4b, 0xbe, 0xf6, 0xdf, 0xb7, 0xe0, 0xec, 0xf2, 0x6e, 0x3b, 0xda, 0xaf, 0xb8,
9597
+-	0xe6, 0xeb, 0xce, 0x2b, 0x30, 0xbc, 0x4b, 0x9a, 0x6e, 0x67, 0x57, 0xcc, 0x5c, 0x59, 0x1e, 0x3f,
9598
+-	0xab, 0xac, 0xf4, 0xe8, 0xa0, 0x3c, 0x5e, 0x8f, 0xfc, 0xc0, 0xd9, 0x22, 0xbc, 0x00, 0x0b, 0x74,
9599
+-	0x76, 0x88, 0xbb, 0xef, 0x93, 0x5b, 0xee, 0xae, 0x2b, 0xed, 0x2c, 0x7a, 0xea, 0xce, 0xe6, 0xe4,
9600
+-	0x80, 0xce, 0xbd, 0xd5, 0x71, 0xbc, 0xc8, 0x8d, 0xf6, 0xc5, 0xc3, 0x8c, 0x24, 0x82, 0x63, 0x7a,
9601
+-	0xf6, 0x37, 0x2c, 0x98, 0x94, 0xeb, 0x7e, 0xa1, 0xd9, 0x0c, 0x48, 0x18, 0xa2, 0x59, 0xc8, 0xb9,
9602
+-	0x6d, 0xd1, 0x4b, 0x10, 0xbd, 0xcc, 0x55, 0x6b, 0x38, 0xe7, 0xb6, 0x51, 0x0d, 0x4a, 0xdc, 0x5c,
9603
+-	0x23, 0x5e, 0x5c, 0x03, 0x19, 0x7d, 0xb0, 0x1e, 0xac, 0xcb, 0x9a, 0x38, 0x26, 0x22, 0x39, 0x38,
9604
+-	0x76, 0x66, 0xe6, 0xcd, 0x57, 0xaf, 0x1b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x15, 0x8a, 0x9e, 0xdf,
9605
+-	0xe4, 0xd6, 0x33, 0xfc, 0xf6, 0x63, 0x4b, 0x76, 0x4d, 0x94, 0x61, 0x05, 0xb5, 0x7f, 0xd0, 0x82,
9606
+-	0x31, 0xf9, 0x65, 0x03, 0x32, 0x93, 0x74, 0x6b, 0xc5, 0x8c, 0x64, 0xbc, 0xb5, 0x28, 0x33, 0xc8,
9607
+-	0x20, 0x06, 0x0f, 0x98, 0x3f, 0x0e, 0x0f, 0x68, 0xff, 0x68, 0x0e, 0x26, 0x64, 0x77, 0xea, 0x9d,
9608
+-	0x8d, 0x90, 0x44, 0x68, 0x1d, 0x4a, 0x0e, 0x1f, 0x72, 0x22, 0x57, 0xec, 0x53, 0xe9, 0xc2, 0x87,
9609
+-	0x31, 0x3f, 0xf1, 0xb5, 0xbc, 0x20, 0x6b, 0xe3, 0x98, 0x10, 0x6a, 0xc1, 0xb4, 0xe7, 0x47, 0xec,
9610
+-	0x88, 0x56, 0xf0, 0x5e, 0x4f, 0x20, 0x49, 0xea, 0x17, 0x04, 0xf5, 0xe9, 0xb5, 0x24, 0x15, 0xdc,
9611
+-	0x4d, 0x18, 0x2d, 0x4b, 0x85, 0x47, 0x3e, 0x5b, 0xdc, 0xd0, 0x67, 0x21, 0x5d, 0xdf, 0x61, 0xff,
9612
+-	0xaa, 0x05, 0x25, 0x89, 0x76, 0x1a, 0xaf, 0x5d, 0xab, 0x30, 0x12, 0xb2, 0x49, 0x90, 0x43, 0x63,
9613
+-	0xf7, 0xea, 0x38, 0x9f, 0xaf, 0xf8, 0xe6, 0xe1, 0xff, 0x43, 0x2c, 0x69, 0x30, 0x7d, 0xb7, 0xea,
9614
+-	0xfe, 0x47, 0x44, 0xdf, 0xad, 0xfa, 0x93, 0x71, 0xc3, 0xfc, 0x57, 0xd6, 0x67, 0x4d, 0xac, 0xa5,
9615
+-	0x0c, 0x52, 0x3b, 0x20, 0x9b, 0xee, 0x83, 0x24, 0x83, 0x54, 0x63, 0xa5, 0x58, 0x40, 0xd1, 0x3b,
9616
+-	0x30, 0xd6, 0x90, 0x8a, 0xce, 0xf8, 0x18, 0xb8, 0xd2, 0x53, 0xe9, 0xae, 0xde, 0x67, 0xb8, 0x65,
9617
+-	0xed, 0x92, 0x56, 0x1f, 0x1b, 0xd4, 0xcc, 0xe7, 0xf6, 0x7c, 0xbf, 0xe7, 0xf6, 0x98, 0x6e, 0xf6,
9618
+-	0xe3, 0xf3, 0x8f, 0x5b, 0x30, 0xcc, 0xd5, 0x65, 0x83, 0xe9, 0x17, 0xb5, 0xe7, 0xaa, 0x78, 0xec,
9619
+-	0xee, 0xd2, 0x42, 0xf1, 0xfc, 0x84, 0x56, 0xa1, 0xc4, 0x7e, 0x30, 0xb5, 0x41, 0x3e, 0xdb, 0xa4,
9620
+-	0x98, 0xb7, 0xaa, 0x77, 0xf0, 0xae, 0xac, 0x86, 0x63, 0x0a, 0xf6, 0x0f, 0xe7, 0xe9, 0x51, 0x15,
9621
+-	0xa3, 0x1a, 0x37, 0xb8, 0xf5, 0xe8, 0x6e, 0xf0, 0xdc, 0xa3, 0xba, 0xc1, 0xb7, 0x60, 0xb2, 0xa1,
9622
+-	0x3d, 0x6e, 0xc5, 0x33, 0x79, 0xb5, 0xe7, 0x22, 0xd1, 0xde, 0xc1, 0xb8, 0xca, 0x68, 0xc9, 0x24,
9623
+-	0x82, 0x93, 0x54, 0xd1, 0x77, 0xc2, 0x18, 0x9f, 0x67, 0xd1, 0x0a, 0xb7, 0x58, 0xf8, 0x44, 0xf6,
9624
+-	0x7a, 0xd1, 0x9b, 0x60, 0x2b, 0xb1, 0xae, 0x55, 0xc7, 0x06, 0x31, 0xfb, 0x97, 0x8a, 0x30, 0xb4,
9625
+-	0xbc, 0x47, 0xbc, 0xe8, 0x14, 0x0e, 0xa4, 0x06, 0x4c, 0xb8, 0xde, 0x9e, 0xdf, 0xda, 0x23, 0x4d,
9626
+-	0x0e, 0x3f, 0xce, 0xe5, 0x7a, 0x5e, 0x90, 0x9e, 0xa8, 0x1a, 0x24, 0x70, 0x82, 0xe4, 0xa3, 0x90,
9627
+-	0x30, 0xaf, 0xc3, 0x30, 0x9f, 0x7b, 0x21, 0x5e, 0xa6, 0x2a, 0x83, 0xd9, 0x20, 0x8a, 0x5d, 0x10,
9628
+-	0x4b, 0xbf, 0x5c, 0xfb, 0x2c, 0xaa, 0xa3, 0x77, 0x61, 0x62, 0xd3, 0x0d, 0xc2, 0x88, 0x8a, 0x86,
9629
+-	0x61, 0xe4, 0xec, 0xb6, 0x1f, 0x42, 0xa2, 0x54, 0xe3, 0xb0, 0x62, 0x50, 0xc2, 0x09, 0xca, 0x68,
9630
+-	0x0b, 0xc6, 0xa9, 0x90, 0x13, 0x37, 0x35, 0x72, 0xec, 0xa6, 0x94, 0xca, 0xe8, 0x96, 0x4e, 0x08,
9631
+-	0x9b, 0x74, 0xe9, 0x61, 0xd2, 0x60, 0x42, 0x51, 0x91, 0x71, 0x14, 0xea, 0x30, 0xe1, 0xd2, 0x10,
9632
+-	0x87, 0xd1, 0x33, 0x89, 0x99, 0xad, 0x94, 0xcc, 0x33, 0x49, 0x33, 0x4e, 0xf9, 0x12, 0x94, 0x08,
9633
+-	0x1d, 0x42, 0x4a, 0x58, 0x28, 0xc6, 0xe7, 0x07, 0xeb, 0xeb, 0xaa, 0xdb, 0x08, 0x7c, 0x53, 0x96,
9634
+-	0x5f, 0x96, 0x94, 0x70, 0x4c, 0x14, 0x2d, 0xc1, 0x70, 0x48, 0x02, 0x97, 0x84, 0x42, 0x45, 0xde,
9635
+-	0x63, 0x1a, 0x19, 0x1a, 0xb7, 0x3d, 0xe7, 0xbf, 0xb1, 0xa8, 0x4a, 0x97, 0x97, 0xc3, 0xa4, 0x21,
9636
+-	0xa6, 0x15, 0xd7, 0x96, 0xd7, 0x02, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x84, 0x91, 0x80, 0xb4, 0x98,
9637
+-	0xb2, 0x68, 0x7c, 0xf0, 0x45, 0xce, 0x75, 0x4f, 0xbc, 0x1e, 0x96, 0x04, 0xd0, 0x4d, 0x40, 0x01,
9638
+-	0xa1, 0x3c, 0x84, 0xeb, 0x6d, 0x29, 0x63, 0x0e, 0xa1, 0xeb, 0x7e, 0x5c, 0xb4, 0x7f, 0x06, 0xc7,
9639
+-	0x18, 0xd2, 0x2a, 0x15, 0xa7, 0x54, 0x43, 0xd7, 0x61, 0x5a, 0x95, 0x56, 0xbd, 0x30, 0x72, 0xbc,
9640
+-	0x06, 0x61, 0x6a, 0xee, 0x52, 0xcc, 0x15, 0xe1, 0x24, 0x02, 0xee, 0xae, 0x63, 0xff, 0x0c, 0x65,
9641
+-	0x67, 0xe8, 0x68, 0x9d, 0x02, 0x2f, 0xf0, 0x86, 0xc9, 0x0b, 0x5c, 0xc8, 0x9c, 0xb9, 0x0c, 0x3e,
9642
+-	0xe0, 0xd0, 0x82, 0x51, 0x6d, 0x66, 0xe3, 0x35, 0x6b, 0xf5, 0x58, 0xb3, 0x1d, 0x98, 0xa2, 0x2b,
9643
+-	0xfd, 0xf6, 0x46, 0x48, 0x82, 0x3d, 0xd2, 0x64, 0x0b, 0x33, 0xf7, 0x70, 0x0b, 0x53, 0xbd, 0x32,
9644
+-	0xdf, 0x4a, 0x10, 0xc4, 0x5d, 0x4d, 0xa0, 0x57, 0xa4, 0xe6, 0x24, 0x6f, 0x18, 0x69, 0x71, 0xad,
9645
+-	0xc8, 0xd1, 0x41, 0x79, 0x4a, 0xfb, 0x10, 0x5d, 0x53, 0x62, 0x7f, 0x49, 0x7e, 0xa3, 0x7a, 0xcd,
9646
+-	0x6f, 0xa8, 0xc5, 0x92, 0x78, 0xcd, 0x57, 0xcb, 0x01, 0xc7, 0x38, 0x74, 0x8f, 0x52, 0x11, 0x24,
9647
+-	0xf9, 0x9a, 0x4f, 0x05, 0x14, 0xcc, 0x20, 0xf6, 0x8b, 0x00, 0xcb, 0x0f, 0x48, 0x83, 0x2f, 0x75,
9648
+-	0xfd, 0x01, 0xd2, 0xca, 0x7e, 0x80, 0xb4, 0xff, 0x9d, 0x05, 0x13, 0x2b, 0x4b, 0x86, 0x98, 0x38,
9649
+-	0x07, 0xc0, 0x65, 0xa3, 0x7b, 0xf7, 0xd6, 0xa4, 0x6e, 0x9d, 0xab, 0x47, 0x55, 0x29, 0xd6, 0x30,
9650
+-	0xd0, 0x05, 0xc8, 0xb7, 0x3a, 0x9e, 0x10, 0x59, 0x46, 0x0e, 0x0f, 0xca, 0xf9, 0x5b, 0x1d, 0x0f,
9651
+-	0xd3, 0x32, 0xcd, 0x42, 0x30, 0x3f, 0xb0, 0x85, 0x60, 0x5f, 0xf7, 0x2a, 0x54, 0x86, 0xa1, 0xfb,
9652
+-	0xf7, 0xdd, 0x26, 0x37, 0x62, 0x17, 0x7a, 0xff, 0x7b, 0xf7, 0xaa, 0x95, 0x10, 0xf3, 0x72, 0xfb,
9653
+-	0xab, 0x79, 0x98, 0x5d, 0x69, 0x91, 0x07, 0x1f, 0xd0, 0x90, 0x7f, 0x50, 0xfb, 0xc6, 0xe3, 0xf1,
9654
+-	0x8b, 0xc7, 0xb5, 0x61, 0xed, 0x3f, 0x1e, 0x9b, 0x30, 0xc2, 0x1f, 0xb3, 0xa5, 0x59, 0xff, 0x6b,
9655
+-	0x69, 0xad, 0x67, 0x0f, 0xc8, 0x1c, 0x7f, 0x14, 0x17, 0xe6, 0xfc, 0xea, 0xa6, 0x15, 0xa5, 0x58,
9656
+-	0x12, 0x9f, 0xfd, 0x0c, 0x8c, 0xe9, 0x98, 0xc7, 0xb2, 0x26, 0xff, 0x0b, 0x79, 0x98, 0xa2, 0x3d,
9657
+-	0x78, 0xa4, 0x13, 0x71, 0xa7, 0x7b, 0x22, 0x4e, 0xda, 0xa2, 0xb8, 0xff, 0x6c, 0xbc, 0x93, 0x9c,
9658
+-	0x8d, 0x17, 0xb2, 0x66, 0xe3, 0xb4, 0xe7, 0xe0, 0x7b, 0x2d, 0x38, 0xb3, 0xd2, 0xf2, 0x1b, 0x3b,
9659
+-	0x09, 0xab, 0xdf, 0x97, 0x61, 0x94, 0x9e, 0xe3, 0xa1, 0xe1, 0x45, 0x64, 0xf8, 0x95, 0x09, 0x10,
9660
+-	0xd6, 0xf1, 0xb4, 0x6a, 0x77, 0xee, 0x54, 0x2b, 0x69, 0xee, 0x68, 0x02, 0x84, 0x75, 0x3c, 0xfb,
9661
+-	0xeb, 0x16, 0x5c, 0xbc, 0xbe, 0xb4, 0x1c, 0x2f, 0xc5, 0x2e, 0x8f, 0x38, 0x2a, 0x05, 0x36, 0xb5,
9662
+-	0xae, 0xc4, 0x52, 0x60, 0x85, 0xf5, 0x42, 0x40, 0x3f, 0x2a, 0xde, 0x9e, 0x3f, 0x6d, 0xc1, 0x99,
9663
+-	0xeb, 0x6e, 0x44, 0xaf, 0xe5, 0xa4, 0x6f, 0x16, 0xbd, 0x97, 0x43, 0x37, 0xf2, 0x83, 0xfd, 0xa4,
9664
+-	0x6f, 0x16, 0x56, 0x10, 0xac, 0x61, 0xf1, 0x96, 0xf7, 0x5c, 0x66, 0x46, 0x95, 0x33, 0x55, 0x51,
9665
+-	0x58, 0x94, 0x63, 0x85, 0x41, 0x3f, 0xac, 0xe9, 0x06, 0x4c, 0x94, 0xd8, 0x17, 0x27, 0xac, 0xfa,
9666
+-	0xb0, 0x8a, 0x04, 0xe0, 0x18, 0xc7, 0xfe, 0x31, 0x0b, 0xce, 0x5d, 0x6f, 0x75, 0xc2, 0x88, 0x04,
9667
+-	0x9b, 0xa1, 0xd1, 0xd9, 0x17, 0xa1, 0x44, 0xa4, 0xb8, 0x2e, 0xfa, 0xaa, 0x18, 0x4c, 0x25, 0xc7,
9668
+-	0x73, 0xc7, 0x30, 0x85, 0x37, 0x80, 0xe7, 0xc0, 0xf1, 0x5c, 0xc7, 0x7e, 0x3e, 0x07, 0xe3, 0x37,
9669
+-	0xd6, 0xd7, 0x6b, 0xd7, 0x49, 0x24, 0x6e, 0xb1, 0xfe, 0xaa, 0x66, 0xac, 0x69, 0xcc, 0x7a, 0x09,
9670
+-	0x45, 0x9d, 0xc8, 0x6d, 0xcd, 0x71, 0x4f, 0xe4, 0xb9, 0xaa, 0x17, 0xdd, 0x0e, 0xea, 0x51, 0xe0,
9671
+-	0x7a, 0x5b, 0xa9, 0x3a, 0x36, 0x79, 0xd7, 0xe6, 0xb3, 0xee, 0x5a, 0xf4, 0x22, 0x0c, 0x33, 0x57,
9672
+-	0x68, 0x29, 0x9e, 0x3c, 0xae, 0x64, 0x0a, 0x56, 0x7a, 0x74, 0x50, 0x2e, 0xdd, 0xc1, 0x55, 0xfe,
9673
+-	0x07, 0x0b, 0x54, 0x74, 0x07, 0x46, 0xb7, 0xa3, 0xa8, 0x7d, 0x83, 0x38, 0x4d, 0x12, 0xc8, 0xd3,
9674
+-	0xe1, 0x52, 0xda, 0xe9, 0x40, 0x07, 0x81, 0xa3, 0xc5, 0x1b, 0x2a, 0x2e, 0x0b, 0xb1, 0x4e, 0xc7,
9675
+-	0xae, 0x03, 0xc4, 0xb0, 0x13, 0xd2, 0x2f, 0xd8, 0x7f, 0x60, 0xc1, 0x08, 0xf7, 0x4a, 0x0b, 0xd0,
9676
+-	0xeb, 0x50, 0x20, 0x0f, 0x48, 0x43, 0x70, 0x8e, 0xa9, 0x1d, 0x8e, 0x19, 0x0f, 0xae, 0x2d, 0xa7,
9677
+-	0xff, 0x31, 0xab, 0x85, 0x6e, 0xc0, 0x08, 0xed, 0xed, 0x75, 0xe5, 0xa2, 0xf7, 0x64, 0xd6, 0x17,
9678
+-	0xab, 0x69, 0xe7, 0xbc, 0x8a, 0x28, 0xc2, 0xb2, 0x3a, 0xd3, 0xfc, 0x36, 0xda, 0x75, 0x7a, 0x80,
9679
+-	0x45, 0xbd, 0xee, 0xd9, 0xf5, 0xa5, 0x1a, 0x47, 0x12, 0xd4, 0xb8, 0xe6, 0x57, 0x16, 0xe2, 0x98,
9680
+-	0x88, 0xbd, 0x0e, 0x25, 0x3a, 0xa9, 0x0b, 0x2d, 0xd7, 0xe9, 0xad, 0x74, 0x7e, 0x16, 0x4a, 0x52,
9681
+-	0x01, 0x1c, 0x0a, 0xc7, 0x26, 0x46, 0x55, 0xea, 0x87, 0x43, 0x1c, 0xc3, 0xed, 0x4d, 0x38, 0xcb,
9682
+-	0x5e, 0xfe, 0x9d, 0x68, 0xdb, 0xd8, 0x63, 0xfd, 0x17, 0xf3, 0x73, 0x42, 0x10, 0xe3, 0x33, 0x33,
9683
+-	0xa3, 0xf9, 0x0e, 0x8c, 0x49, 0x8a, 0xb1, 0x50, 0x66, 0xff, 0x61, 0x01, 0x1e, 0xaf, 0xd6, 0xb3,
9684
+-	0x1d, 0x16, 0x5f, 0x85, 0x31, 0xce, 0xa6, 0xd1, 0xa5, 0xed, 0xb4, 0x44, 0xbb, 0xea, 0x5d, 0x6c,
9685
+-	0x5d, 0x83, 0x61, 0x03, 0x13, 0x5d, 0x84, 0xbc, 0xfb, 0x9e, 0x97, 0x34, 0xc3, 0xad, 0xbe, 0xb5,
9686
+-	0x86, 0x69, 0x39, 0x05, 0x53, 0x8e, 0x8f, 0x1f, 0xa5, 0x0a, 0xac, 0xb8, 0xbe, 0x37, 0x60, 0xc2,
9687
+-	0x0d, 0x1b, 0xa1, 0x5b, 0xf5, 0xe8, 0x39, 0x13, 0x3b, 0xbb, 0xc6, 0x4a, 0x02, 0xda, 0x69, 0x05,
9688
+-	0xc5, 0x09, 0x6c, 0xed, 0x5c, 0x1f, 0x1a, 0x98, 0x6b, 0xec, 0xeb, 0xe9, 0x43, 0x19, 0xe2, 0x36,
9689
+-	0xfb, 0xba, 0x90, 0x19, 0xb5, 0x09, 0x86, 0x98, 0x7f, 0x70, 0x88, 0x25, 0x8c, 0x4a, 0x60, 0x8d,
9690
+-	0x6d, 0xa7, 0xbd, 0xd0, 0x89, 0xb6, 0x2b, 0x6e, 0xd8, 0xf0, 0xf7, 0x48, 0xb0, 0xcf, 0x84, 0xe7,
9691
+-	0x62, 0x2c, 0x81, 0x29, 0xc0, 0xd2, 0x8d, 0x85, 0x1a, 0xc5, 0xc4, 0xdd, 0x75, 0x4c, 0xae, 0x10,
9692
+-	0x4e, 0x82, 0x2b, 0x5c, 0x80, 0x49, 0xd9, 0x4c, 0x9d, 0x84, 0xec, 0x8e, 0x18, 0x65, 0x1d, 0x53,
9693
+-	0xa6, 0xb6, 0xa2, 0x58, 0x75, 0x2b, 0x89, 0x8f, 0x5e, 0x81, 0x71, 0xd7, 0x73, 0x23, 0xd7, 0x89,
9694
+-	0xfc, 0x80, 0xdd, 0xb0, 0x5c, 0x4e, 0x66, 0x96, 0x6c, 0x55, 0x1d, 0x80, 0x4d, 0x3c, 0xfb, 0x3f,
9695
+-	0x15, 0x60, 0x9a, 0x4d, 0xdb, 0xb7, 0x56, 0xd8, 0x47, 0x66, 0x85, 0xdd, 0xe9, 0x5e, 0x61, 0x27,
9696
+-	0xc1, 0xee, 0x7e, 0x98, 0xcb, 0xec, 0x5d, 0x28, 0x29, 0x5b, 0x60, 0xe9, 0x0c, 0x60, 0x65, 0x38,
9697
+-	0x03, 0xf4, 0xe7, 0x3e, 0xe4, 0x33, 0x6e, 0x3e, 0xf5, 0x19, 0xf7, 0x6f, 0x59, 0x10, 0x9b, 0x44,
9698
+-	0xa2, 0x1b, 0x50, 0x6a, 0xfb, 0xcc, 0xec, 0x20, 0x90, 0xb6, 0x3c, 0x8f, 0xa7, 0x5e, 0x54, 0xfc,
9699
+-	0x52, 0xe4, 0xe3, 0x57, 0x93, 0x35, 0x70, 0x5c, 0x19, 0x2d, 0xc2, 0x48, 0x3b, 0x20, 0xf5, 0x88,
9700
+-	0xb9, 0xc0, 0xf6, 0xa5, 0xc3, 0xd7, 0x08, 0xc7, 0xc7, 0xb2, 0xa2, 0xfd, 0x0b, 0x16, 0x00, 0x7f,
9701
+-	0x29, 0x75, 0xbc, 0x2d, 0x72, 0x0a, 0xda, 0xdf, 0x0a, 0x14, 0xc2, 0x36, 0x69, 0xf4, 0x32, 0x08,
9702
+-	0x89, 0xfb, 0x53, 0x6f, 0x93, 0x46, 0x3c, 0xe0, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0xef, 0x03, 0x98,
9703
+-	0x88, 0xd1, 0xaa, 0x11, 0xd9, 0x45, 0xcf, 0x1b, 0x2e, 0x71, 0x17, 0x12, 0x2e, 0x71, 0x25, 0x86,
9704
+-	0xad, 0x29, 0x1a, 0xdf, 0x85, 0xfc, 0xae, 0xf3, 0x40, 0x68, 0x92, 0x9e, 0xed, 0xdd, 0x0d, 0x4a,
9705
+-	0x7f, 0x6e, 0xd5, 0x79, 0xc0, 0x65, 0xa6, 0x67, 0xe5, 0x02, 0x59, 0x75, 0x1e, 0x1c, 0x71, 0xb3,
9706
+-	0x0f, 0x76, 0x48, 0xdd, 0x72, 0xc3, 0xe8, 0xcb, 0xff, 0x31, 0xfe, 0xcf, 0x96, 0x1d, 0x6d, 0x84,
9707
+-	0xb5, 0xe5, 0x7a, 0xe2, 0xdd, 0x70, 0xa0, 0xb6, 0x5c, 0x2f, 0xd9, 0x96, 0xeb, 0x0d, 0xd0, 0x96,
9708
+-	0xeb, 0xa1, 0xf7, 0x61, 0x44, 0xbc, 0xd1, 0x33, 0x5b, 0x6f, 0x53, 0x4b, 0x95, 0xd5, 0x9e, 0x78,
9709
+-	0xe2, 0xe7, 0x6d, 0xce, 0x4b, 0x99, 0x50, 0x94, 0xf6, 0x6d, 0x57, 0x36, 0x88, 0xfe, 0xba, 0x05,
9710
+-	0x13, 0xe2, 0x37, 0x26, 0xef, 0x75, 0x48, 0x18, 0x09, 0xde, 0xf3, 0xd3, 0x83, 0xf7, 0x41, 0x54,
9711
+-	0xe4, 0x5d, 0xf9, 0xb4, 0x3c, 0x66, 0x4d, 0x60, 0xdf, 0x1e, 0x25, 0x7a, 0x81, 0xfe, 0xa1, 0x05,
9712
+-	0x67, 0x77, 0x9d, 0x07, 0xbc, 0x45, 0x5e, 0x86, 0x9d, 0xc8, 0xf5, 0x85, 0xed, 0xfa, 0xeb, 0x83,
9713
+-	0x4d, 0x7f, 0x57, 0x75, 0xde, 0x49, 0x69, 0xe6, 0x7a, 0x36, 0x0d, 0xa5, 0x6f, 0x57, 0x53, 0xfb,
9714
+-	0x35, 0xbb, 0x09, 0x45, 0xb9, 0xde, 0x52, 0x24, 0xef, 0x8a, 0xce, 0x58, 0x1f, 0xdb, 0x44, 0x42,
9715
+-	0xf7, 0x4b, 0xa3, 0xed, 0x88, 0xb5, 0xf6, 0x48, 0xdb, 0x79, 0x17, 0xc6, 0xf4, 0x35, 0xf6, 0x48,
9716
+-	0xdb, 0x7a, 0x0f, 0xce, 0xa4, 0xac, 0xa5, 0x47, 0xda, 0xe4, 0x7d, 0xb8, 0x90, 0xb9, 0x3e, 0x1e,
9717
+-	0x65, 0xc3, 0xf6, 0xcf, 0x5b, 0xfa, 0x39, 0x78, 0x0a, 0x2a, 0xf8, 0x25, 0x53, 0x05, 0x7f, 0xa9,
9718
+-	0xf7, 0xce, 0xc9, 0xd0, 0xc3, 0xbf, 0xa3, 0x77, 0x9a, 0x9e, 0xea, 0xe8, 0x4d, 0x18, 0x6e, 0xd1,
9719
+-	0x12, 0x69, 0x1c, 0x62, 0xf7, 0xdf, 0x91, 0x31, 0x2f, 0xc5, 0xca, 0x43, 0x2c, 0x28, 0xd8, 0xbf,
9720
+-	0x6c, 0x41, 0xe1, 0x14, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x7c, 0x26, 0x69, 0x11, 0xd2, 0x6c, 0x0e,
9721
+-	0x3b, 0xf7, 0x97, 0x1f, 0x44, 0xc4, 0x0b, 0x99, 0xa8, 0x98, 0x3a, 0x30, 0xdf, 0x05, 0x67, 0x6e,
9722
+-	0xf9, 0x4e, 0x73, 0xd1, 0x69, 0x39, 0x5e, 0x83, 0x04, 0x55, 0x6f, 0xab, 0xaf, 0x95, 0x92, 0x6e,
9723
+-	0x53, 0x94, 0xeb, 0x67, 0x53, 0x64, 0x6f, 0x03, 0xd2, 0x1b, 0x10, 0x76, 0x9c, 0x18, 0x46, 0x5c,
9724
+-	0xde, 0x94, 0x18, 0xfe, 0xa7, 0xd3, 0xb9, 0xbb, 0xae, 0x9e, 0x69, 0x16, 0x8a, 0xbc, 0x00, 0x4b,
9725
+-	0x42, 0xf6, 0xab, 0x90, 0xea, 0xbb, 0xd5, 0x5f, 0x6d, 0x60, 0x7f, 0x1e, 0xa6, 0x59, 0xcd, 0x63,
9726
+-	0x8a, 0xb4, 0x76, 0x42, 0x49, 0x97, 0x12, 0x32, 0xca, 0xfe, 0x8a, 0x05, 0x93, 0x6b, 0x89, 0xf8,
9727
+-	0x15, 0x57, 0xd8, 0x7b, 0x60, 0x8a, 0x6e, 0xb8, 0xce, 0x4a, 0xb1, 0x80, 0x9e, 0xb8, 0x0e, 0xea,
9728
+-	0x4f, 0x2d, 0x88, 0xdd, 0x29, 0x4f, 0x81, 0xf1, 0x5a, 0x32, 0x18, 0xaf, 0x54, 0xdd, 0x88, 0xea,
9729
+-	0x4e, 0x16, 0xdf, 0x85, 0x6e, 0xaa, 0xd8, 0x01, 0x3d, 0xd4, 0x22, 0x31, 0x19, 0xee, 0x69, 0x3e,
9730
+-	0x61, 0x06, 0x18, 0x90, 0xd1, 0x04, 0x98, 0x29, 0x91, 0xc2, 0xfd, 0x88, 0x98, 0x12, 0xa9, 0xfe,
9731
+-	0x64, 0xec, 0xd0, 0x9a, 0xd6, 0x65, 0x76, 0x72, 0x7d, 0x3b, 0x33, 0x0d, 0x77, 0x5a, 0xee, 0xfb,
9732
+-	0x44, 0x05, 0x40, 0x29, 0x0b, 0x53, 0x6f, 0x51, 0x7a, 0x74, 0x50, 0x1e, 0x57, 0xff, 0x78, 0x94,
9733
+-	0xac, 0xb8, 0x8a, 0x7d, 0x03, 0x26, 0x13, 0x03, 0x86, 0x5e, 0x86, 0xa1, 0xf6, 0xb6, 0x13, 0x92,
9734
+-	0x84, 0xf9, 0xe4, 0x50, 0x8d, 0x16, 0x1e, 0x1d, 0x94, 0x27, 0x54, 0x05, 0x56, 0x82, 0x39, 0xb6,
9735
+-	0xfd, 0x3f, 0x2d, 0x28, 0xac, 0xf9, 0xcd, 0xd3, 0x58, 0x4c, 0x6f, 0x18, 0x8b, 0xe9, 0x89, 0xac,
9736
+-	0x18, 0x83, 0x99, 0xeb, 0x68, 0x25, 0xb1, 0x8e, 0x2e, 0x65, 0x52, 0xe8, 0xbd, 0x84, 0x76, 0x61,
9737
+-	0x94, 0x45, 0x2e, 0x14, 0xe6, 0x9c, 0x2f, 0x1a, 0x32, 0x40, 0x39, 0x21, 0x03, 0x4c, 0x6a, 0xa8,
9738
+-	0x9a, 0x24, 0xf0, 0x0c, 0x8c, 0x08, 0x93, 0xc2, 0xa4, 0x11, 0xbc, 0xc0, 0xc5, 0x12, 0x6e, 0xff,
9739
+-	0x78, 0x1e, 0x8c, 0x48, 0x89, 0xe8, 0x57, 0x2d, 0x98, 0x0b, 0xb8, 0x57, 0x61, 0xb3, 0xd2, 0x09,
9740
+-	0x5c, 0x6f, 0xab, 0xde, 0xd8, 0x26, 0xcd, 0x4e, 0xcb, 0xf5, 0xb6, 0xaa, 0x5b, 0x9e, 0xaf, 0x8a,
9741
+-	0x97, 0x1f, 0x90, 0x46, 0x87, 0xbd, 0x0b, 0xf4, 0x09, 0xcb, 0xa8, 0x4c, 0x76, 0xae, 0x1d, 0x1e,
9742
+-	0x94, 0xe7, 0xf0, 0xb1, 0x68, 0xe3, 0x63, 0xf6, 0x05, 0x7d, 0xdd, 0x82, 0x79, 0x1e, 0x40, 0x70,
9743
+-	0xf0, 0xfe, 0xf7, 0x90, 0x98, 0x6a, 0x92, 0x54, 0x4c, 0x64, 0x9d, 0x04, 0xbb, 0x8b, 0xaf, 0x88,
9744
+-	0x01, 0x9d, 0xaf, 0x1d, 0xaf, 0x2d, 0x7c, 0xdc, 0xce, 0xd9, 0xff, 0x22, 0x0f, 0xe3, 0xc2, 0xa1,
9745
+-	0x5d, 0x44, 0x4a, 0x79, 0xd9, 0x58, 0x12, 0x4f, 0x26, 0x96, 0xc4, 0xb4, 0x81, 0x7c, 0x32, 0x41,
9746
+-	0x52, 0x42, 0x98, 0x6e, 0x39, 0x61, 0x74, 0x83, 0x38, 0x41, 0xb4, 0x41, 0x1c, 0x6e, 0xca, 0x92,
9747
+-	0x3f, 0xb6, 0xd9, 0x8d, 0x52, 0xd1, 0xdc, 0x4a, 0x12, 0xc3, 0xdd, 0xf4, 0xd1, 0x1e, 0x20, 0x66,
9748
+-	0x8f, 0x13, 0x38, 0x5e, 0xc8, 0xbf, 0xc5, 0x15, 0x6f, 0x06, 0xc7, 0x6b, 0x75, 0x56, 0xb4, 0x8a,
9749
+-	0x6e, 0x75, 0x51, 0xc3, 0x29, 0x2d, 0x68, 0x76, 0x56, 0x43, 0x83, 0xda, 0x59, 0x0d, 0xf7, 0xf1,
9750
+-	0x34, 0xf1, 0x60, 0xaa, 0x2b, 0x26, 0xc1, 0xdb, 0x50, 0x52, 0xf6, 0x70, 0xe2, 0xd0, 0xe9, 0x1d,
9751
+-	0xda, 0x23, 0x49, 0x81, 0xab, 0x51, 0x62, 0x5b, 0xcc, 0x98, 0x9c, 0xfd, 0x8f, 0x72, 0x46, 0x83,
9752
+-	0x7c, 0x12, 0xd7, 0xa0, 0xe8, 0x84, 0xa1, 0xbb, 0xe5, 0x91, 0xa6, 0xd8, 0xb1, 0x1f, 0xcf, 0xda,
9753
+-	0xb1, 0x46, 0x33, 0xcc, 0x26, 0x71, 0x41, 0xd4, 0xc4, 0x8a, 0x06, 0xba, 0xc1, 0x0d, 0x86, 0xf6,
9754
+-	0x24, 0xcf, 0x3f, 0x18, 0x35, 0x90, 0x26, 0x45, 0x7b, 0x04, 0x8b, 0xfa, 0xe8, 0x0b, 0xdc, 0xa2,
9755
+-	0xeb, 0xa6, 0xe7, 0xdf, 0xf7, 0xae, 0xfb, 0xbe, 0xf4, 0x42, 0x1b, 0x8c, 0xe0, 0xb4, 0xb4, 0xe3,
9756
+-	0x52, 0xd5, 0xb1, 0x49, 0x6d, 0xb0, 0xb8, 0x3d, 0xdf, 0x0d, 0x67, 0x28, 0x69, 0xd3, 0x97, 0x24,
9757
+-	0x44, 0x04, 0x26, 0x45, 0xb4, 0x04, 0x59, 0x26, 0xc6, 0x2e, 0x95, 0x9d, 0x37, 0x6b, 0xc7, 0x4a,
9758
+-	0xbf, 0x9b, 0x26, 0x09, 0x9c, 0xa4, 0x69, 0xff, 0x94, 0x05, 0xcc, 0x0a, 0xfe, 0x14, 0x58, 0x86,
9759
+-	0xcf, 0x9a, 0x2c, 0xc3, 0x4c, 0xd6, 0x20, 0x67, 0x70, 0x0b, 0x2f, 0xf1, 0x95, 0x55, 0x0b, 0xfc,
9760
+-	0x07, 0xfb, 0xe2, 0x35, 0xbd, 0x3f, 0x27, 0x6b, 0xff, 0x5f, 0x8b, 0x1f, 0x62, 0xca, 0x31, 0x1d,
9761
+-	0x7d, 0x0f, 0x14, 0x1b, 0x4e, 0xdb, 0x69, 0xf0, 0xb0, 0xbe, 0x99, 0x5a, 0x1d, 0xa3, 0xd2, 0xdc,
9762
+-	0x92, 0xa8, 0xc1, 0xb5, 0x14, 0x32, 0xea, 0x46, 0x51, 0x16, 0xf7, 0xd5, 0x4c, 0xa8, 0x26, 0x67,
9763
+-	0x77, 0x60, 0xdc, 0x20, 0xf6, 0x48, 0x45, 0xda, 0xef, 0xe1, 0x57, 0xac, 0x8a, 0x12, 0xb3, 0x0b,
9764
+-	0xd3, 0x9e, 0xf6, 0x9f, 0x5e, 0x28, 0x52, 0x4c, 0xf9, 0x78, 0xbf, 0x4b, 0x94, 0xdd, 0x3e, 0x9a,
9765
+-	0x95, 0x7f, 0x82, 0x0c, 0xee, 0xa6, 0x6c, 0xff, 0x84, 0x05, 0x8f, 0xe9, 0x88, 0x5a, 0xcc, 0x80,
9766
+-	0x7e, 0x7a, 0xe2, 0x0a, 0x14, 0xfd, 0x36, 0x09, 0x9c, 0xc8, 0x0f, 0xc4, 0xad, 0x71, 0x55, 0x0e,
9767
+-	0xfa, 0x6d, 0x51, 0x7e, 0x24, 0xe2, 0x2b, 0x4a, 0xea, 0xb2, 0x1c, 0xab, 0x9a, 0x54, 0x8e, 0x61,
9768
+-	0x83, 0x11, 0x8a, 0x78, 0x0e, 0xec, 0x0c, 0x60, 0x4f, 0xa6, 0x21, 0x16, 0x10, 0xfb, 0x0f, 0x2d,
9769
+-	0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0xf7, 0x60, 0x6a, 0xd7, 0x89, 0x1a, 0xdb, 0xcb, 0x0f, 0xda, 0x01,
9770
+-	0x57, 0x8f, 0xcb, 0x71, 0x7a, 0xb6, 0xdf, 0x38, 0x69, 0x1f, 0x19, 0x1b, 0xa9, 0xad, 0x26, 0x88,
9771
+-	0xe1, 0x2e, 0xf2, 0x68, 0x03, 0x46, 0x59, 0x19, 0xb3, 0x86, 0x0e, 0x7b, 0xb1, 0x06, 0x59, 0xad,
9772
+-	0xa9, 0x57, 0xe7, 0xd5, 0x98, 0x0e, 0xd6, 0x89, 0xda, 0x5f, 0xce, 0xf3, 0xdd, 0xce, 0xb8, 0xed,
9773
+-	0x67, 0x60, 0xa4, 0xed, 0x37, 0x97, 0xaa, 0x15, 0x2c, 0x66, 0x41, 0x5d, 0x23, 0x35, 0x5e, 0x8c,
9774
+-	0x25, 0x1c, 0xbd, 0x06, 0x40, 0x1e, 0x44, 0x24, 0xf0, 0x9c, 0x96, 0x32, 0x1a, 0x51, 0x66, 0x92,
9775
+-	0x15, 0x7f, 0xcd, 0x8f, 0xee, 0x84, 0xe4, 0xbb, 0x96, 0x15, 0x0a, 0xd6, 0xd0, 0xd1, 0x35, 0x80,
9776
+-	0x76, 0xe0, 0xef, 0xb9, 0x4d, 0xe6, 0x5e, 0x97, 0x37, 0x4d, 0x2a, 0x6a, 0x0a, 0x82, 0x35, 0x2c,
9777
+-	0xf4, 0x1a, 0x8c, 0x77, 0xbc, 0x90, 0x73, 0x28, 0xce, 0x86, 0x88, 0x4e, 0x58, 0x8c, 0xad, 0x1b,
9778
+-	0xee, 0xe8, 0x40, 0x6c, 0xe2, 0xa2, 0x05, 0x18, 0x8e, 0x1c, 0x66, 0x13, 0x31, 0x94, 0x6d, 0xdb,
9779
+-	0xb8, 0x4e, 0x31, 0xf4, 0xa0, 0xb2, 0xb4, 0x02, 0x16, 0x15, 0xd1, 0xdb, 0xd2, 0x57, 0x81, 0x9f,
9780
+-	0xf5, 0xc2, 0xa8, 0x78, 0xb0, 0x7b, 0x41, 0xf3, 0x54, 0x10, 0xc6, 0xca, 0x06, 0x2d, 0xfb, 0xeb,
9781
+-	0x25, 0x80, 0x98, 0x1d, 0x47, 0xef, 0x77, 0x9d, 0x47, 0xcf, 0xf5, 0x66, 0xe0, 0x4f, 0xee, 0x30,
9782
+-	0x42, 0xdf, 0x6f, 0xc1, 0xa8, 0xd3, 0x6a, 0xf9, 0x0d, 0x27, 0x62, 0xa3, 0x9c, 0xeb, 0x7d, 0x1e,
9783
+-	0x8a, 0xf6, 0x17, 0xe2, 0x1a, 0xbc, 0x0b, 0x2f, 0xca, 0x85, 0xa7, 0x41, 0xfa, 0xf6, 0x42, 0x6f,
9784
+-	0x18, 0x7d, 0x4a, 0x4a, 0x69, 0x7c, 0x79, 0xcc, 0x26, 0xa5, 0xb4, 0x12, 0x3b, 0xfa, 0x35, 0x01,
9785
+-	0x0d, 0xdd, 0x31, 0x02, 0xcf, 0x15, 0xb2, 0x63, 0x30, 0x18, 0x5c, 0x69, 0xbf, 0x98, 0x73, 0xa8,
9786
+-	0xa6, 0x3b, 0x57, 0x0d, 0x65, 0x07, 0x2a, 0xd1, 0xc4, 0x9f, 0x3e, 0x8e, 0x55, 0xef, 0xc2, 0x64,
9787
+-	0xd3, 0xbc, 0xdb, 0xc5, 0x6a, 0x7a, 0x3a, 0x8b, 0x6e, 0x82, 0x15, 0x88, 0x6f, 0xf3, 0x04, 0x00,
9788
+-	0x27, 0x09, 0xa3, 0x1a, 0x77, 0x73, 0xab, 0x7a, 0x9b, 0xbe, 0x30, 0x4e, 0xb7, 0x33, 0xe7, 0x72,
9789
+-	0x3f, 0x8c, 0xc8, 0x2e, 0xc5, 0x8c, 0x2f, 0xed, 0x35, 0x51, 0x17, 0x2b, 0x2a, 0xe8, 0x4d, 0x18,
9790
+-	0x66, 0x7e, 0xb2, 0xe1, 0x4c, 0x31, 0x5b, 0x99, 0x68, 0x86, 0x78, 0x88, 0x37, 0x15, 0xfb, 0x1b,
9791
+-	0x62, 0x41, 0x01, 0xdd, 0x90, 0x71, 0x60, 0xc2, 0xaa, 0x77, 0x27, 0x24, 0x2c, 0x0e, 0x4c, 0x69,
9792
+-	0xf1, 0xe3, 0x71, 0x88, 0x17, 0x5e, 0x9e, 0x1a, 0x3e, 0xde, 0xa8, 0x49, 0x99, 0x23, 0xf1, 0x5f,
9793
+-	0x46, 0xa5, 0x9f, 0x81, 0xec, 0xee, 0x99, 0x91, 0xeb, 0xe3, 0xe1, 0xbc, 0x6b, 0x92, 0xc0, 0x49,
9794
+-	0x9a, 0x94, 0xd1, 0xe4, 0x3b, 0x57, 0x98, 0xb7, 0xf7, 0xdb, 0xff, 0x5c, 0xbe, 0x66, 0x97, 0x0c,
9795
+-	0x2f, 0xc1, 0xa2, 0xfe, 0xa9, 0xde, 0xfa, 0xb3, 0x1e, 0x4c, 0x25, 0xb7, 0xe8, 0x23, 0xe5, 0x32,
9796
+-	0xfe, 0xa0, 0x00, 0x13, 0xe6, 0x92, 0x42, 0xf3, 0x50, 0x12, 0x44, 0x54, 0x50, 0x52, 0xb5, 0x4b,
9797
+-	0x56, 0x25, 0x00, 0xc7, 0x38, 0x2c, 0x16, 0x2d, 0xab, 0xae, 0x99, 0x25, 0xc6, 0xb1, 0x68, 0x15,
9798
+-	0x04, 0x6b, 0x58, 0x54, 0x5e, 0xda, 0xf0, 0xfd, 0x48, 0x5d, 0x2a, 0x6a, 0xdd, 0x2d, 0xb2, 0x52,
9799
+-	0x2c, 0xa0, 0xf4, 0x32, 0xd9, 0x21, 0x81, 0x47, 0x5a, 0x66, 0xac, 0x33, 0x75, 0x99, 0xdc, 0xd4,
9800
+-	0x81, 0xd8, 0xc4, 0xa5, 0xb7, 0xa4, 0x1f, 0xb2, 0x85, 0x2c, 0xa4, 0xb2, 0xd8, 0xcc, 0xb3, 0xce,
9801
+-	0x3d, 0xce, 0x25, 0x1c, 0x7d, 0x1e, 0x1e, 0x53, 0x0e, 0xe2, 0x98, 0x2b, 0xaa, 0x65, 0x8b, 0xc3,
9802
+-	0x86, 0x12, 0xe5, 0xb1, 0xa5, 0x74, 0x34, 0x9c, 0x55, 0x1f, 0xbd, 0x01, 0x13, 0x82, 0x73, 0x97,
9803
+-	0x14, 0x47, 0x4c, 0xdb, 0x89, 0x9b, 0x06, 0x14, 0x27, 0xb0, 0x65, 0xb4, 0x36, 0xc6, 0x3c, 0x4b,
9804
+-	0x0a, 0xc5, 0xee, 0x68, 0x6d, 0x3a, 0x1c, 0x77, 0xd5, 0x40, 0x0b, 0x30, 0xc9, 0x59, 0x2b, 0xd7,
9805
+-	0xdb, 0xe2, 0x73, 0x22, 0xbc, 0x4f, 0xd4, 0x96, 0xba, 0x6d, 0x82, 0x71, 0x12, 0x1f, 0xbd, 0x0a,
9806
+-	0x63, 0x4e, 0xd0, 0xd8, 0x76, 0x23, 0xd2, 0x88, 0x3a, 0x01, 0x77, 0x4b, 0xd1, 0x8c, 0x4f, 0x16,
9807
+-	0x34, 0x18, 0x36, 0x30, 0xed, 0xf7, 0xe1, 0x4c, 0x8a, 0xe3, 0x1a, 0x5d, 0x38, 0x4e, 0xdb, 0x95,
9808
+-	0xdf, 0x94, 0x30, 0xd8, 0x5c, 0xa8, 0x55, 0xe5, 0xd7, 0x68, 0x58, 0x74, 0x75, 0x32, 0x07, 0x37,
9809
+-	0x2d, 0x09, 0x85, 0x5a, 0x9d, 0x2b, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x7f, 0xe5, 0x60, 0x32, 0x45,
9810
+-	0xf9, 0xce, 0x12, 0x21, 0x24, 0x64, 0x8f, 0x38, 0xef, 0x81, 0x19, 0xfc, 0x2f, 0x77, 0x8c, 0xe0,
9811
+-	0x7f, 0xf9, 0x7e, 0xc1, 0xff, 0x0a, 0x1f, 0x24, 0xf8, 0x9f, 0x39, 0x62, 0x43, 0x03, 0x8d, 0x58,
9812
+-	0x4a, 0xc0, 0xc0, 0xe1, 0x63, 0x06, 0x0c, 0x34, 0x06, 0x7d, 0x64, 0x80, 0x41, 0xff, 0xe1, 0x1c,
9813
+-	0x4c, 0x25, 0x8d, 0xe4, 0x4e, 0x41, 0x1d, 0xfb, 0xa6, 0xa1, 0x8e, 0x4d, 0x4f, 0x2b, 0x92, 0x34,
9814
+-	0xdd, 0xcb, 0x52, 0xcd, 0xe2, 0x84, 0x6a, 0xf6, 0x93, 0x03, 0x51, 0xeb, 0xad, 0xa6, 0xfd, 0x3b,
9815
+-	0x39, 0x38, 0x97, 0xac, 0xb2, 0xd4, 0x72, 0xdc, 0xdd, 0x53, 0x18, 0x9b, 0xdb, 0xc6, 0xd8, 0x3c,
9816
+-	0x3f, 0xc8, 0xd7, 0xb0, 0xae, 0x65, 0x0e, 0xd0, 0xbd, 0xc4, 0x00, 0xcd, 0x0f, 0x4e, 0xb2, 0xf7,
9817
+-	0x28, 0x7d, 0x23, 0x0f, 0x97, 0x52, 0xeb, 0xc5, 0xda, 0xcc, 0x15, 0x43, 0x9b, 0x79, 0x2d, 0xa1,
9818
+-	0xcd, 0xb4, 0x7b, 0xd7, 0x3e, 0x19, 0xf5, 0xa6, 0xf0, 0x28, 0x64, 0x01, 0xe2, 0x1e, 0x52, 0xb5,
9819
+-	0x69, 0x78, 0x14, 0x2a, 0x42, 0xd8, 0xa4, 0xfb, 0xcd, 0xa4, 0xd2, 0xfc, 0x57, 0x16, 0x5c, 0x48,
9820
+-	0x9d, 0x9b, 0x53, 0x50, 0x61, 0xad, 0x99, 0x2a, 0xac, 0x67, 0x06, 0x5e, 0xad, 0x19, 0x3a, 0xad,
9821
+-	0xdf, 0x2c, 0x64, 0x7c, 0x0b, 0x13, 0xd0, 0x6f, 0xc3, 0xa8, 0xd3, 0x68, 0x90, 0x30, 0x5c, 0xf5,
9822
+-	0x9b, 0x2a, 0x60, 0xda, 0xf3, 0x4c, 0xce, 0x8a, 0x8b, 0x8f, 0x0e, 0xca, 0xb3, 0x49, 0x12, 0x31,
9823
+-	0x18, 0xeb, 0x14, 0xcc, 0x18, 0x8f, 0xb9, 0x13, 0x8d, 0xf1, 0x78, 0x0d, 0x60, 0x4f, 0x71, 0xeb,
9824
+-	0x49, 0x21, 0x5f, 0xe3, 0xe3, 0x35, 0x2c, 0xf4, 0x05, 0x28, 0x86, 0xe2, 0x1a, 0x17, 0x4b, 0xf1,
9825
+-	0xc5, 0x01, 0xe7, 0xca, 0xd9, 0x20, 0x2d, 0xd3, 0x75, 0x5d, 0xe9, 0x43, 0x14, 0x49, 0xf4, 0x1d,
9826
+-	0x30, 0x15, 0xf2, 0xc8, 0x28, 0x4b, 0x2d, 0x27, 0x64, 0x7e, 0x10, 0x62, 0x15, 0x32, 0x7f, 0xf4,
9827
+-	0x7a, 0x02, 0x86, 0xbb, 0xb0, 0xd1, 0x8a, 0xfc, 0x28, 0x16, 0xc6, 0x85, 0x2f, 0xcc, 0x2b, 0xf1,
9828
+-	0x07, 0x89, 0x34, 0x4c, 0x67, 0x93, 0xc3, 0xcf, 0x06, 0x5e, 0xab, 0x89, 0xbe, 0x00, 0x40, 0x97,
9829
+-	0x8f, 0xd0, 0x25, 0x8c, 0x64, 0x1f, 0x9e, 0xf4, 0x54, 0x69, 0xa6, 0x5a, 0x7e, 0x32, 0x5f, 0xbe,
9830
+-	0x8a, 0x22, 0x82, 0x35, 0x82, 0xf6, 0x0f, 0x17, 0xe0, 0xf1, 0x1e, 0x67, 0x24, 0x5a, 0x30, 0x9f,
9831
+-	0x40, 0x9f, 0x4d, 0x0a, 0xd7, 0xb3, 0xa9, 0x95, 0x0d, 0x69, 0x3b, 0xb1, 0x14, 0x73, 0x1f, 0x78,
9832
+-	0x29, 0xfe, 0x80, 0xa5, 0xa9, 0x3d, 0xb8, 0x31, 0xdf, 0x67, 0x8f, 0x79, 0xf6, 0x9f, 0xa0, 0x1e,
9833
+-	0x64, 0x33, 0x45, 0x99, 0x70, 0x6d, 0xe0, 0xee, 0x0c, 0xac, 0x5d, 0x38, 0x5d, 0xe5, 0xef, 0x97,
9834
+-	0x2d, 0x78, 0x32, 0xb5, 0xbf, 0x86, 0xc9, 0xc6, 0x3c, 0x94, 0x1a, 0xb4, 0x50, 0x73, 0xdd, 0x8a,
9835
+-	0x7d, 0x5a, 0x25, 0x00, 0xc7, 0x38, 0x86, 0x65, 0x46, 0xae, 0xaf, 0x65, 0xc6, 0x3f, 0xb7, 0xa0,
9836
+-	0x6b, 0x7f, 0x9c, 0xc2, 0x41, 0x5d, 0x35, 0x0f, 0xea, 0x8f, 0x0f, 0x32, 0x97, 0x19, 0x67, 0xf4,
9837
+-	0x7f, 0x9e, 0x84, 0xf3, 0x19, 0xbe, 0x1a, 0x7b, 0x30, 0xbd, 0xd5, 0x20, 0xa6, 0x53, 0x9c, 0xf8,
9838
+-	0x98, 0x54, 0xff, 0xc1, 0x9e, 0x1e, 0x74, 0x2c, 0x3d, 0xcf, 0x74, 0x17, 0x0a, 0xee, 0x6e, 0x02,
9839
+-	0x7d, 0xd9, 0x82, 0xb3, 0xce, 0xfd, 0xb0, 0x2b, 0x09, 0xa3, 0x58, 0x33, 0x2f, 0xa5, 0x2a, 0x41,
9840
+-	0xfa, 0x24, 0x6d, 0xe4, 0xf9, 0x8a, 0xd2, 0xb0, 0x70, 0x6a, 0x5b, 0x08, 0x8b, 0x10, 0x9a, 0x94,
9841
+-	0x9d, 0xef, 0xe1, 0xb6, 0x99, 0xe6, 0x54, 0xc3, 0x8f, 0x6c, 0x09, 0xc1, 0x8a, 0x0e, 0xba, 0x0b,
9842
+-	0xa5, 0x2d, 0xe9, 0xe9, 0x26, 0xae, 0x84, 0xd4, 0x3b, 0x36, 0xd5, 0x1d, 0x8e, 0x3f, 0x4b, 0x2a,
9843
+-	0x10, 0x8e, 0x49, 0xa1, 0x37, 0x20, 0xef, 0x6d, 0x86, 0xbd, 0x12, 0xfd, 0x24, 0x2c, 0x99, 0xb8,
9844
+-	0x4b, 0xf4, 0xda, 0x4a, 0x1d, 0xd3, 0x8a, 0xe8, 0x06, 0xe4, 0x83, 0x8d, 0xa6, 0xd0, 0xdb, 0xa5,
9845
+-	0x9e, 0xdc, 0x78, 0xb1, 0x92, 0xbe, 0x48, 0x38, 0x25, 0xbc, 0x58, 0xc1, 0x94, 0x04, 0xaa, 0xc1,
9846
+-	0x10, 0x73, 0x6b, 0x10, 0xb7, 0x40, 0x2a, 0xbf, 0xdb, 0xc3, 0x3d, 0x88, 0xfb, 0x4d, 0x33, 0x04,
9847
+-	0xcc, 0x09, 0xa1, 0x75, 0x18, 0x6e, 0xb0, 0xa4, 0x30, 0x22, 0x6a, 0xf3, 0xa7, 0x52, 0x35, 0x74,
9848
+-	0x3d, 0xb2, 0xe5, 0x08, 0x85, 0x15, 0xc3, 0xc0, 0x82, 0x16, 0xa3, 0x4a, 0xda, 0xdb, 0x9b, 0x21,
9849
+-	0x93, 0xf0, 0xb3, 0xa8, 0xf6, 0x48, 0x02, 0x25, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x40,
9850
+-	0x6e, 0xb3, 0x21, 0xbc, 0x1e, 0x52, 0x55, 0x75, 0xa6, 0x57, 0xfb, 0xe2, 0xf0, 0xe1, 0x41, 0x39,
9851
+-	0xb7, 0xb2, 0x84, 0x73, 0x9b, 0x0d, 0xb4, 0x06, 0x23, 0x9b, 0xdc, 0x0f, 0x56, 0x68, 0xe3, 0x9e,
9852
+-	0x4e, 0x77, 0xd1, 0xed, 0x72, 0x95, 0xe5, 0xd6, 0xfa, 0x02, 0x80, 0x25, 0x11, 0x16, 0x87, 0x52,
9853
+-	0xf9, 0xf3, 0x8a, 0x80, 0xcc, 0x73, 0xc7, 0xf3, 0xc1, 0xe6, 0xb7, 0x72, 0xec, 0x15, 0x8c, 0x35,
9854
+-	0x8a, 0xe8, 0x4b, 0x50, 0x72, 0x64, 0xfa, 0x3f, 0x11, 0xb0, 0xe2, 0xc5, 0xd4, 0x8d, 0xd9, 0x3b,
9855
+-	0x33, 0x22, 0x5f, 0xd5, 0x0a, 0x09, 0xc7, 0x44, 0xd1, 0x0e, 0x8c, 0xef, 0x85, 0xed, 0x6d, 0x22,
9856
+-	0x37, 0x32, 0x8b, 0x5f, 0x91, 0x71, 0x71, 0xdd, 0x15, 0x88, 0x6e, 0x10, 0x75, 0x9c, 0x56, 0xd7,
9857
+-	0xd9, 0xc3, 0xde, 0xb2, 0xef, 0xea, 0xc4, 0xb0, 0x49, 0x9b, 0x0e, 0xff, 0x7b, 0x1d, 0x7f, 0x63,
9858
+-	0x3f, 0x22, 0x22, 0x82, 0x73, 0xea, 0xf0, 0xbf, 0xc5, 0x51, 0xba, 0x87, 0x5f, 0x00, 0xb0, 0x24,
9859
+-	0x42, 0xb7, 0xba, 0x23, 0x53, 0x6b, 0xb2, 0xc8, 0xcd, 0x19, 0x5b, 0x3d, 0x35, 0xff, 0xa6, 0x36,
9860
+-	0x28, 0xec, 0x8c, 0x8c, 0x49, 0xb1, 0xb3, 0xb1, 0xbd, 0xed, 0x47, 0xbe, 0x97, 0x38, 0x97, 0xa7,
9861
+-	0xb3, 0xcf, 0xc6, 0x5a, 0x0a, 0x7e, 0xf7, 0xd9, 0x98, 0x86, 0x85, 0x53, 0xdb, 0x42, 0x4d, 0x98,
9862
+-	0x68, 0xfb, 0x41, 0x74, 0xdf, 0x0f, 0xe4, 0xfa, 0x42, 0x3d, 0xb4, 0x09, 0x06, 0xa6, 0x68, 0x91,
9863
+-	0x45, 0x14, 0x37, 0x21, 0x38, 0x41, 0x13, 0x7d, 0x0e, 0x46, 0xc2, 0x86, 0xd3, 0x22, 0xd5, 0xdb,
9864
+-	0x33, 0x67, 0xb2, 0x2f, 0x9d, 0x3a, 0x47, 0xc9, 0x58, 0x5d, 0x6c, 0x72, 0x04, 0x0a, 0x96, 0xe4,
9865
+-	0xd0, 0x0a, 0x0c, 0xb1, 0xb4, 0x00, 0x2c, 0xf8, 0x74, 0x46, 0x60, 0xa4, 0x2e, 0xbb, 0x52, 0x7e,
9866
+-	0x36, 0xb1, 0x62, 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0x98, 0x6a, 0x3f, 0x9c, 0x39, 0x97, 0xbd, 0x07,
9867
+-	0x04, 0x2f, 0x7e, 0xbb, 0xde, 0x6b, 0x0f, 0x28, 0x24, 0x1c, 0x13, 0xa5, 0x27, 0x33, 0x3d, 0x4d,
9868
+-	0xcf, 0xf7, 0x30, 0x63, 0xc9, 0x3c, 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, 0x4a, 0xc2, 0xfe, 0xbd,
9869
+-	0x91, 0x6e, 0x4e, 0x85, 0x89, 0x61, 0x7f, 0xd1, 0xea, 0x7a, 0xa1, 0xfb, 0xf4, 0xa0, 0x5a, 0xa1,
9870
+-	0x13, 0xe4, 0x51, 0xbf, 0x6c, 0xc1, 0xf9, 0x76, 0xea, 0x87, 0x88, 0x6b, 0x7f, 0x30, 0xe5, 0x12,
9871
+-	0xff, 0x74, 0x15, 0x20, 0x3e, 0x1d, 0x8e, 0x33, 0x5a, 0x4a, 0xca, 0x01, 0xf9, 0x0f, 0x2c, 0x07,
9872
+-	0xac, 0x42, 0x91, 0xb1, 0x96, 0x7d, 0x92, 0xa4, 0x25, 0xc5, 0x21, 0xc6, 0x40, 0x2c, 0x89, 0x8a,
9873
+-	0x58, 0x91, 0x40, 0x3f, 0x68, 0xc1, 0xc5, 0x64, 0xd7, 0x31, 0x61, 0x60, 0x11, 0x4e, 0x9d, 0x4b,
9874
+-	0x80, 0x2b, 0xe2, 0xfb, 0x2f, 0xd6, 0x7a, 0x21, 0x1f, 0xf5, 0x43, 0xc0, 0xbd, 0x1b, 0x43, 0x95,
9875
+-	0x14, 0x11, 0x74, 0xd8, 0x54, 0xbb, 0x0f, 0x20, 0x86, 0xbe, 0x04, 0x63, 0xbb, 0x7e, 0xc7, 0x8b,
9876
+-	0x84, 0xd5, 0x8b, 0xf0, 0x53, 0x64, 0xcf, 0xcc, 0xab, 0x5a, 0x39, 0x36, 0xb0, 0x12, 0xc2, 0x6b,
9877
+-	0xf1, 0xa1, 0x85, 0xd7, 0x77, 0x12, 0xa9, 0xb0, 0x4b, 0xd9, 0x61, 0xfb, 0x84, 0x9c, 0x7f, 0x8c,
9878
+-	0x84, 0xd8, 0xa7, 0x2b, 0x11, 0xfd, 0x8c, 0x95, 0xc2, 0xca, 0x73, 0x19, 0xf9, 0x75, 0x53, 0x46,
9879
+-	0xbe, 0x92, 0x94, 0x91, 0xbb, 0x54, 0xae, 0x86, 0x78, 0x3c, 0x78, 0xec, 0xe7, 0x41, 0x83, 0xa9,
9880
+-	0xd9, 0x2d, 0xb8, 0xdc, 0xef, 0x5a, 0x62, 0xe6, 0x4f, 0x4d, 0xf5, 0xc0, 0x16, 0x9b, 0x3f, 0x35,
9881
+-	0xab, 0x15, 0xcc, 0x20, 0x83, 0x46, 0xdb, 0xb0, 0xff, 0x9b, 0x05, 0xf9, 0x9a, 0xdf, 0x3c, 0x05,
9882
+-	0x15, 0xf2, 0x67, 0x0d, 0x15, 0xf2, 0xe3, 0x19, 0x29, 0xca, 0x33, 0x15, 0xc6, 0xcb, 0x09, 0x85,
9883
+-	0xf1, 0xc5, 0x2c, 0x02, 0xbd, 0xd5, 0xc3, 0x3f, 0x99, 0x07, 0x3d, 0xa1, 0x3a, 0xfa, 0xcd, 0x87,
9884
+-	0xb1, 0x3d, 0xce, 0xf7, 0xca, 0xb1, 0x2e, 0x28, 0x33, 0xab, 0x29, 0xe9, 0x7a, 0xf7, 0x67, 0xcc,
9885
+-	0x04, 0xf9, 0x1e, 0x71, 0xb7, 0xb6, 0x23, 0xd2, 0x4c, 0x7e, 0xce, 0xe9, 0x99, 0x20, 0xff, 0x17,
9886
+-	0x0b, 0x26, 0x13, 0xad, 0xa3, 0x16, 0x8c, 0xb7, 0x74, 0xfd, 0x9f, 0x58, 0xa7, 0x0f, 0xa5, 0x3a,
9887
+-	0x14, 0x26, 0x9c, 0x5a, 0x11, 0x36, 0x89, 0xa3, 0x39, 0x00, 0xf5, 0x3e, 0x27, 0xf5, 0x5e, 0x8c,
9888
+-	0xeb, 0x57, 0x0f, 0x78, 0x21, 0xd6, 0x30, 0xd0, 0xcb, 0x30, 0x1a, 0xf9, 0x6d, 0xbf, 0xe5, 0x6f,
9889
+-	0xed, 0xdf, 0x24, 0x32, 0xbe, 0x8b, 0x32, 0xcc, 0x5a, 0x8f, 0x41, 0x58, 0xc7, 0xb3, 0x7f, 0x3a,
9890
+-	0x0f, 0xc9, 0x24, 0xfc, 0xdf, 0x5a, 0x93, 0x1f, 0xcd, 0x35, 0xf9, 0x0d, 0x0b, 0xa6, 0x68, 0xeb,
9891
+-	0xcc, 0x48, 0x44, 0x5e, 0xb6, 0x2a, 0x07, 0x8d, 0xd5, 0x23, 0x07, 0xcd, 0x15, 0x7a, 0x76, 0x35,
9892
+-	0xfd, 0x4e, 0x24, 0xf4, 0x66, 0xda, 0xe1, 0x44, 0x4b, 0xb1, 0x80, 0x0a, 0x3c, 0x12, 0x04, 0xc2,
9893
+-	0xf3, 0x49, 0xc7, 0x23, 0x41, 0x80, 0x05, 0x54, 0xa6, 0xa8, 0x29, 0x64, 0xa4, 0xa8, 0x61, 0xd1,
9894
+-	0xea, 0x84, 0x39, 0x81, 0x60, 0x7b, 0xb4, 0x68, 0x75, 0xd2, 0xce, 0x20, 0xc6, 0xb1, 0x7f, 0x3e,
9895
+-	0x0f, 0x63, 0x35, 0xbf, 0x19, 0xbf, 0x90, 0xbd, 0x64, 0xbc, 0x90, 0x5d, 0x4e, 0xbc, 0x90, 0x4d,
9896
+-	0xe9, 0xb8, 0xdf, 0x7a, 0x0f, 0xfb, 0xb0, 0xde, 0xc3, 0xfe, 0x99, 0xc5, 0x66, 0xad, 0xb2, 0x56,
9897
+-	0x17, 0x29, 0x72, 0x5f, 0x80, 0x51, 0x76, 0x20, 0x31, 0x57, 0x3b, 0xf9, 0x6c, 0xc4, 0xa2, 0xcf,
9898
+-	0xaf, 0xc5, 0xc5, 0x58, 0xc7, 0x41, 0x57, 0xa1, 0x18, 0x12, 0x27, 0x68, 0x6c, 0xab, 0x33, 0x4e,
9899
+-	0x3c, 0xaa, 0xf0, 0x32, 0xac, 0xa0, 0xe8, 0xad, 0x38, 0x50, 0x5a, 0x3e, 0x3b, 0xd9, 0xab, 0xde,
9900
+-	0x1f, 0xbe, 0x45, 0xb2, 0xa3, 0xa3, 0xd9, 0xf7, 0x00, 0x75, 0xe3, 0x0f, 0x10, 0x12, 0xa9, 0x6c,
9901
+-	0x86, 0x44, 0x2a, 0x75, 0x85, 0x43, 0xfa, 0x13, 0x0b, 0x26, 0x6a, 0x7e, 0x93, 0x6e, 0xdd, 0x6f,
9902
+-	0xa6, 0x7d, 0xaa, 0x47, 0x89, 0x1c, 0xee, 0x11, 0x25, 0xf2, 0xef, 0x5a, 0x30, 0x52, 0xf3, 0x9b,
9903
+-	0xa7, 0xa0, 0x6d, 0x7f, 0xdd, 0xd4, 0xb6, 0x3f, 0x96, 0xb1, 0x24, 0x32, 0x14, 0xec, 0xbf, 0x98,
9904
+-	0x87, 0x71, 0xda, 0x4f, 0x7f, 0x4b, 0xce, 0x92, 0x31, 0x22, 0xd6, 0x00, 0x23, 0x42, 0xd9, 0x5c,
9905
+-	0xbf, 0xd5, 0xf2, 0xef, 0x27, 0x67, 0x6c, 0x85, 0x95, 0x62, 0x01, 0x45, 0xcf, 0x41, 0xb1, 0x1d,
9906
+-	0x90, 0x3d, 0xd7, 0x17, 0xfc, 0xa3, 0xf6, 0x76, 0x51, 0x13, 0xe5, 0x58, 0x61, 0x50, 0xb9, 0x2b,
9907
+-	0x74, 0xbd, 0x06, 0x91, 0x99, 0xa6, 0x0b, 0x2c, 0x19, 0x15, 0x0f, 0xff, 0xac, 0x95, 0x63, 0x03,
9908
+-	0x0b, 0xdd, 0x83, 0x12, 0xfb, 0xcf, 0x4e, 0x94, 0xe3, 0x27, 0xcf, 0x11, 0x39, 0x17, 0x04, 0x01,
9909
+-	0x1c, 0xd3, 0x42, 0xd7, 0x00, 0x22, 0x19, 0x22, 0x38, 0x14, 0x91, 0x6d, 0x14, 0xaf, 0xad, 0x82,
9910
+-	0x07, 0x87, 0x58, 0xc3, 0x42, 0xcf, 0x42, 0x29, 0x72, 0xdc, 0xd6, 0x2d, 0xd7, 0x23, 0x21, 0x53,
9911
+-	0x39, 0xe7, 0x65, 0x4a, 0x05, 0x51, 0x88, 0x63, 0x38, 0xe5, 0x75, 0x98, 0xdb, 0x37, 0x4f, 0xbd,
9912
+-	0x55, 0x64, 0xd8, 0x8c, 0xd7, 0xb9, 0xa5, 0x4a, 0xb1, 0x86, 0x61, 0xbf, 0x0a, 0xe7, 0x6a, 0x7e,
9913
+-	0xb3, 0xe6, 0x07, 0xd1, 0x8a, 0x1f, 0xdc, 0x77, 0x82, 0xa6, 0x9c, 0xbf, 0xb2, 0x8c, 0xee, 0x4f,
9914
+-	0xcf, 0x9e, 0x21, 0xbe, 0x33, 0x8d, 0xb8, 0xfd, 0x2f, 0x32, 0x6e, 0xe7, 0x98, 0xae, 0x1c, 0x0d,
9915
+-	0x76, 0xef, 0xaa, 0x2c, 0x7b, 0xd7, 0x9d, 0x88, 0xa0, 0xdb, 0x2c, 0x33, 0x57, 0x7c, 0x05, 0x89,
9916
+-	0xea, 0xcf, 0x68, 0x99, 0xb9, 0x62, 0x60, 0xea, 0x9d, 0x65, 0xd6, 0xb7, 0x7f, 0x2d, 0xcf, 0x4e,
9917
+-	0xa3, 0x44, 0xd2, 0x39, 0xf4, 0x45, 0x98, 0x08, 0xc9, 0x2d, 0xd7, 0xeb, 0x3c, 0x90, 0x42, 0x78,
9918
+-	0x0f, 0x67, 0x9c, 0xfa, 0xb2, 0x8e, 0xc9, 0x55, 0x79, 0x66, 0x19, 0x4e, 0x50, 0xa3, 0xf3, 0x14,
9919
+-	0x74, 0xbc, 0x85, 0xf0, 0x4e, 0x48, 0x02, 0x91, 0xf4, 0x8c, 0xcd, 0x13, 0x96, 0x85, 0x38, 0x86,
9920
+-	0xd3, 0x75, 0xc9, 0xfe, 0xac, 0xf9, 0x1e, 0xf6, 0xfd, 0x48, 0xae, 0x64, 0x96, 0x36, 0x47, 0x2b,
9921
+-	0xc7, 0x06, 0x16, 0x5a, 0x01, 0x14, 0x76, 0xda, 0xed, 0x16, 0x7b, 0xce, 0x77, 0x5a, 0xd7, 0x03,
9922
+-	0xbf, 0xd3, 0xe6, 0x6f, 0x9d, 0xf9, 0xc5, 0xf3, 0xf4, 0x0a, 0xab, 0x77, 0x41, 0x71, 0x4a, 0x0d,
9923
+-	0x7a, 0xfa, 0x6c, 0x86, 0xec, 0x37, 0x5b, 0xdd, 0x79, 0xa1, 0x5e, 0xaf, 0xb3, 0x22, 0x2c, 0x61,
9924
+-	0x74, 0x31, 0xb1, 0xe6, 0x39, 0xe6, 0x70, 0xbc, 0x98, 0xb0, 0x2a, 0xc5, 0x1a, 0x06, 0x5a, 0x86,
9925
+-	0x91, 0x70, 0x3f, 0x6c, 0x44, 0x22, 0x0e, 0x53, 0x46, 0xfa, 0xca, 0x3a, 0x43, 0xd1, 0x52, 0x2a,
9926
+-	0xf0, 0x2a, 0x58, 0xd6, 0xb5, 0xbf, 0x87, 0x5d, 0x86, 0x2c, 0x45, 0x56, 0xd4, 0x09, 0x08, 0xda,
9927
+-	0x85, 0xf1, 0x36, 0x9b, 0x72, 0x11, 0xc0, 0x59, 0xcc, 0xdb, 0x4b, 0x03, 0x4a, 0xb5, 0xf7, 0xe9,
9928
+-	0x41, 0xa3, 0xb4, 0x4e, 0x4c, 0x5c, 0xa8, 0xe9, 0xe4, 0xb0, 0x49, 0xdd, 0xfe, 0xd7, 0xd3, 0xec,
9929
+-	0xcc, 0xad, 0x73, 0x51, 0x75, 0x44, 0x18, 0x14, 0x0b, 0xbe, 0x7c, 0x36, 0x5b, 0x67, 0x12, 0x7f,
9930
+-	0x91, 0x30, 0x4a, 0xc6, 0xb2, 0x2e, 0x7a, 0x8b, 0xbd, 0x4d, 0xf3, 0x83, 0xae, 0x5f, 0xa6, 0x62,
9931
+-	0x8e, 0x65, 0x3c, 0x43, 0x8b, 0x8a, 0x58, 0x23, 0x82, 0x6e, 0xc1, 0xb8, 0xc8, 0xa8, 0x24, 0x94,
9932
+-	0x62, 0x79, 0x43, 0xe9, 0x31, 0x8e, 0x75, 0xe0, 0x51, 0xb2, 0x00, 0x9b, 0x95, 0xd1, 0x16, 0x5c,
9933
+-	0xd4, 0xd2, 0x0b, 0x5e, 0x0f, 0x1c, 0xf6, 0x5e, 0xe9, 0xb2, 0x4d, 0xa4, 0x9d, 0x9b, 0x4f, 0x1e,
9934
+-	0x1e, 0x94, 0x2f, 0xae, 0xf7, 0x42, 0xc4, 0xbd, 0xe9, 0xa0, 0xdb, 0x70, 0x8e, 0xfb, 0xed, 0x55,
9935
+-	0x88, 0xd3, 0x6c, 0xb9, 0x9e, 0x3a, 0x98, 0xf9, 0x3a, 0xbc, 0x70, 0x78, 0x50, 0x3e, 0xb7, 0x90,
9936
+-	0x86, 0x80, 0xd3, 0xeb, 0xa1, 0xd7, 0xa1, 0xd4, 0xf4, 0x42, 0x31, 0x06, 0xc3, 0x46, 0xe6, 0xcc,
9937
+-	0x52, 0x65, 0xad, 0xae, 0xbe, 0x3f, 0xfe, 0x83, 0xe3, 0x0a, 0x68, 0x8b, 0x2b, 0xc6, 0x94, 0x1c,
9938
+-	0x3a, 0x92, 0x9d, 0x25, 0x5d, 0x2c, 0x09, 0xc3, 0x73, 0x87, 0x6b, 0x84, 0x95, 0xe5, 0xab, 0xe1,
9939
+-	0xd4, 0x63, 0x10, 0x46, 0x6f, 0x02, 0xa2, 0x8c, 0x9a, 0xdb, 0x20, 0x0b, 0x0d, 0x16, 0x47, 0x9b,
9940
+-	0xe9, 0x11, 0x8b, 0x86, 0xa7, 0x04, 0xaa, 0x77, 0x61, 0xe0, 0x94, 0x5a, 0xe8, 0x06, 0x3d, 0xc8,
9941
+-	0xf4, 0x52, 0x61, 0xc1, 0x2b, 0x99, 0xfb, 0x99, 0x0a, 0x69, 0x07, 0xa4, 0xe1, 0x44, 0xa4, 0x69,
9942
+-	0x52, 0xc4, 0x89, 0x7a, 0xf4, 0x2e, 0x55, 0x29, 0x75, 0xc0, 0x0c, 0x96, 0xd1, 0x9d, 0x56, 0x87,
9943
+-	0xca, 0xc5, 0xdb, 0x7e, 0x18, 0xad, 0x91, 0xe8, 0xbe, 0x1f, 0xec, 0x88, 0xd8, 0x64, 0x71, 0x98,
9944
+-	0xcc, 0x18, 0x84, 0x75, 0x3c, 0xca, 0x07, 0xb3, 0xc7, 0xe1, 0x6a, 0x85, 0xbd, 0xd0, 0x15, 0xe3,
9945
+-	0x7d, 0x72, 0x83, 0x17, 0x63, 0x09, 0x97, 0xa8, 0xd5, 0xda, 0x12, 0x7b, 0x6d, 0x4b, 0xa0, 0x56,
9946
+-	0x6b, 0x4b, 0x58, 0xc2, 0x11, 0xe9, 0xce, 0x4a, 0x3a, 0x91, 0xad, 0xd5, 0xec, 0xbe, 0x0e, 0x06,
9947
+-	0x4c, 0x4c, 0xea, 0xc1, 0x94, 0xca, 0x87, 0xca, 0x83, 0xb6, 0x85, 0x33, 0x93, 0x6c, 0x91, 0x0c,
9948
+-	0x1e, 0xf1, 0x4d, 0xe9, 0x89, 0xab, 0x09, 0x4a, 0xb8, 0x8b, 0xb6, 0x11, 0xbe, 0x64, 0xaa, 0x6f,
9949
+-	0x4a, 0xa4, 0x79, 0x28, 0x85, 0x9d, 0x8d, 0xa6, 0xbf, 0xeb, 0xb8, 0x1e, 0x7b, 0x1c, 0xd3, 0x98,
9950
+-	0xac, 0xba, 0x04, 0xe0, 0x18, 0x07, 0xad, 0x40, 0xd1, 0x91, 0x4a, 0x60, 0x94, 0x1d, 0xab, 0x40,
9951
+-	0xa9, 0x7e, 0xb9, 0xfb, 0xae, 0x54, 0xfb, 0xaa, 0xba, 0xe8, 0x35, 0x18, 0x17, 0xde, 0x5a, 0x3c,
9952
+-	0x82, 0x03, 0x7b, 0xbc, 0xd2, 0xcc, 0xf1, 0xeb, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x0b, 0x30, 0x41,
9953
+-	0xa9, 0xc4, 0x07, 0xdb, 0xcc, 0xd9, 0x41, 0x4e, 0x44, 0x2d, 0xd5, 0x85, 0x5e, 0x19, 0x27, 0x88,
9954
+-	0xa1, 0x26, 0x3c, 0xe1, 0x74, 0x22, 0x9f, 0x29, 0xd2, 0xcd, 0xf5, 0xbf, 0xee, 0xef, 0x10, 0x8f,
9955
+-	0xbd, 0x61, 0x15, 0x17, 0x2f, 0x1f, 0x1e, 0x94, 0x9f, 0x58, 0xe8, 0x81, 0x87, 0x7b, 0x52, 0x41,
9956
+-	0x77, 0x60, 0x34, 0xf2, 0x5b, 0xcc, 0x30, 0x9e, 0xb2, 0x12, 0xe7, 0xb3, 0xc3, 0xff, 0xac, 0x2b,
9957
+-	0x34, 0x5d, 0x89, 0xa4, 0xaa, 0x62, 0x9d, 0x0e, 0x5a, 0xe7, 0x7b, 0x8c, 0x05, 0x46, 0x25, 0xe1,
9958
+-	0xcc, 0x63, 0xd9, 0x03, 0xa3, 0xe2, 0xa7, 0x9a, 0x5b, 0x50, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x1d,
9959
+-	0xa6, 0xdb, 0x81, 0xeb, 0xb3, 0x85, 0xad, 0x1e, 0x31, 0x66, 0xcc, 0xec, 0x06, 0xb5, 0x24, 0x02,
9960
+-	0xee, 0xae, 0x43, 0x85, 0x4c, 0x59, 0x38, 0x73, 0x81, 0xa7, 0xca, 0xe2, 0x8c, 0x37, 0x2f, 0xc3,
9961
+-	0x0a, 0x8a, 0x56, 0xd9, 0xb9, 0xcc, 0xc5, 0xc1, 0x99, 0xd9, 0xec, 0x18, 0x0f, 0xba, 0xd8, 0xc8,
9962
+-	0xf9, 0x25, 0xf5, 0x17, 0xc7, 0x14, 0xe8, 0xbd, 0x11, 0x6e, 0x3b, 0x01, 0xa9, 0x05, 0x7e, 0x83,
9963
+-	0xf0, 0xce, 0x70, 0x9b, 0xfc, 0xc7, 0x79, 0xfc, 0x46, 0x7a, 0x6f, 0xd4, 0xd3, 0x10, 0x70, 0x7a,
9964
+-	0x3d, 0xd4, 0xd4, 0x32, 0x44, 0x53, 0x36, 0x34, 0x9c, 0x79, 0xa2, 0x87, 0x99, 0x51, 0x82, 0x67,
9965
+-	0x8d, 0xd7, 0xa2, 0x51, 0x1c, 0xe2, 0x04, 0x4d, 0xf4, 0x1d, 0x30, 0x25, 0xc2, 0x1d, 0xc5, 0xe3,
9966
+-	0x7e, 0x31, 0xb6, 0x5f, 0xc4, 0x09, 0x18, 0xee, 0xc2, 0x9e, 0xfd, 0x76, 0x98, 0xee, 0xba, 0x71,
9967
+-	0x8e, 0x15, 0x7c, 0xfc, 0x8f, 0x87, 0xa0, 0xa4, 0x94, 0xe9, 0x68, 0xde, 0x7c, 0x23, 0xb9, 0x90,
9968
+-	0x7c, 0x23, 0x29, 0x52, 0x9e, 0x5e, 0x7f, 0x16, 0x59, 0x37, 0xcc, 0xea, 0x72, 0xd9, 0xa9, 0xbe,
9969
+-	0x74, 0xae, 0xbc, 0xaf, 0x8b, 0x9e, 0xa6, 0x1b, 0xc9, 0x0f, 0xfc, 0xd8, 0x52, 0xe8, 0xa9, 0x6e,
9970
+-	0x19, 0x30, 0xd3, 0x2e, 0x7a, 0x8a, 0x0a, 0x36, 0xcd, 0x6a, 0x2d, 0x99, 0x7a, 0xb2, 0x46, 0x0b,
9971
+-	0x31, 0x87, 0x31, 0x01, 0x90, 0xb2, 0x47, 0x4c, 0x00, 0x1c, 0x79, 0x48, 0x01, 0x50, 0x12, 0xc0,
9972
+-	0x31, 0x2d, 0xd4, 0x82, 0xe9, 0x86, 0x99, 0x35, 0x54, 0xb9, 0xe5, 0x3d, 0xd5, 0x37, 0x7f, 0x67,
9973
+-	0x47, 0x4b, 0xd1, 0xb6, 0x94, 0xa4, 0x82, 0xbb, 0x09, 0xa3, 0xd7, 0xa0, 0xf8, 0x9e, 0x1f, 0xb2,
9974
+-	0xc5, 0x24, 0x78, 0x04, 0xe9, 0xbe, 0x54, 0x7c, 0xeb, 0x76, 0x9d, 0x95, 0x1f, 0x1d, 0x94, 0x47,
9975
+-	0x6b, 0x7e, 0x53, 0xfe, 0xc5, 0xaa, 0x02, 0x7a, 0x00, 0xe7, 0x8c, 0x93, 0x55, 0x75, 0x17, 0x06,
9976
+-	0xef, 0xee, 0x45, 0xd1, 0xdc, 0xb9, 0x6a, 0x1a, 0x25, 0x9c, 0xde, 0x00, 0x3d, 0xae, 0x3c, 0x5f,
9977
+-	0x64, 0xdc, 0x95, 0x7c, 0x08, 0x63, 0x37, 0x4a, 0xba, 0xf3, 0x7a, 0x02, 0x01, 0x77, 0xd7, 0xb1,
9978
+-	0x7f, 0x85, 0xbf, 0x3d, 0x08, 0x0d, 0x25, 0x09, 0x3b, 0xad, 0xd3, 0x48, 0xe8, 0xb4, 0x6c, 0x28,
9979
+-	0x4f, 0x1f, 0xfa, 0x7d, 0xeb, 0x37, 0x2c, 0xf6, 0xbe, 0xb5, 0x4e, 0x76, 0xdb, 0x2d, 0x2a, 0x27,
9980
+-	0x3f, 0xfa, 0x8e, 0xbf, 0x05, 0xc5, 0x48, 0xb4, 0xd6, 0x2b, 0x07, 0x95, 0xd6, 0x29, 0xf6, 0xc6,
9981
+-	0xa7, 0x38, 0x14, 0x59, 0x8a, 0x15, 0x19, 0xfb, 0x9f, 0xf0, 0x19, 0x90, 0x90, 0x53, 0x50, 0x64,
9982
+-	0x55, 0x4c, 0x45, 0x56, 0xb9, 0xcf, 0x17, 0x64, 0x28, 0xb4, 0xfe, 0xb1, 0xd9, 0x6f, 0x26, 0x0c,
9983
+-	0x7e, 0xd4, 0x1f, 0x56, 0xed, 0x1f, 0xb1, 0xe0, 0x6c, 0x9a, 0x25, 0x12, 0xe5, 0x2a, 0xb9, 0x28,
9984
+-	0xaa, 0x1e, 0x9a, 0xd5, 0x08, 0xde, 0x15, 0xe5, 0x58, 0x61, 0x0c, 0x9c, 0xde, 0xe1, 0x78, 0xf1,
9985
+-	0xdd, 0x6e, 0xc3, 0x78, 0x2d, 0x20, 0xda, 0x1d, 0xf0, 0x06, 0xf7, 0x83, 0xe3, 0xfd, 0x79, 0xee,
9986
+-	0xd8, 0x3e, 0x70, 0xf6, 0xcf, 0xe6, 0xe0, 0x2c, 0x7f, 0x29, 0x5a, 0xd8, 0xf3, 0xdd, 0x66, 0xcd,
9987
+-	0x6f, 0x8a, 0xd4, 0x1c, 0x6f, 0xc3, 0x58, 0x5b, 0xd3, 0x1f, 0xf4, 0x8a, 0x30, 0xa5, 0xeb, 0x19,
9988
+-	0x62, 0x39, 0x4e, 0x2f, 0xc5, 0x06, 0x2d, 0xd4, 0x84, 0x31, 0xb2, 0xe7, 0x36, 0xd4, 0x73, 0x43,
9989
+-	0xee, 0xd8, 0x77, 0x83, 0x6a, 0x65, 0x59, 0xa3, 0x83, 0x0d, 0xaa, 0x8f, 0x20, 0x5b, 0x9b, 0xfd,
9990
+-	0xa3, 0x16, 0x3c, 0x96, 0x11, 0x8f, 0x8a, 0x36, 0x77, 0x9f, 0xbd, 0xc9, 0x89, 0xc4, 0x4f, 0xaa,
9991
+-	0x39, 0xfe, 0x52, 0x87, 0x05, 0x14, 0x7d, 0x0e, 0x80, 0xbf, 0xb4, 0x51, 0xb1, 0xa6, 0x5f, 0xe0,
9992
+-	0x1e, 0x23, 0xe6, 0x88, 0x16, 0x2b, 0x42, 0xd6, 0xc7, 0x1a, 0x2d, 0xfb, 0xa7, 0xf2, 0x30, 0xc4,
9993
+-	0x5e, 0x76, 0xd0, 0x0a, 0x8c, 0x6c, 0xf3, 0x08, 0xcd, 0x83, 0x04, 0x83, 0x8e, 0xe5, 0x43, 0x5e,
9994
+-	0x80, 0x65, 0x65, 0xb4, 0x0a, 0x67, 0x78, 0x84, 0xeb, 0x56, 0x85, 0xb4, 0x9c, 0x7d, 0xa9, 0x66,
9995
+-	0xe0, 0xc9, 0x92, 0x54, 0xdc, 0x8b, 0x6a, 0x37, 0x0a, 0x4e, 0xab, 0x87, 0xde, 0x80, 0x09, 0xca,
9996
+-	0x97, 0xf9, 0x9d, 0x48, 0x52, 0xe2, 0xb1, 0xad, 0x15, 0x23, 0xb8, 0x6e, 0x40, 0x71, 0x02, 0x9b,
9997
+-	0x0a, 0x4c, 0xed, 0x2e, 0x85, 0xca, 0x50, 0x2c, 0x30, 0x99, 0x4a, 0x14, 0x13, 0x97, 0x99, 0x20,
9998
+-	0x75, 0x98, 0xc1, 0xd5, 0xfa, 0x76, 0x40, 0xc2, 0x6d, 0xbf, 0xd5, 0x14, 0xb9, 0xb6, 0x63, 0x13,
9999
+-	0xa4, 0x04, 0x1c, 0x77, 0xd5, 0xa0, 0x54, 0x36, 0x1d, 0xb7, 0xd5, 0x09, 0x48, 0x4c, 0x65, 0xd8,
10000
+-	0xa4, 0xb2, 0x92, 0x80, 0xe3, 0xae, 0x1a, 0x74, 0x1d, 0x9d, 0x13, 0xc9, 0xaf, 0xa5, 0x37, 0xbe,
10001
+-	0xb2, 0x2b, 0x1b, 0x91, 0x7e, 0x49, 0x3d, 0xc2, 0xd1, 0x08, 0xcb, 0x1b, 0x95, 0x3e, 0x5b, 0xd3,
10002
+-	0x03, 0x0a, 0x8f, 0x24, 0x49, 0xe5, 0x61, 0x52, 0x30, 0xff, 0x9e, 0x05, 0x67, 0x52, 0xec, 0x57,
10003
+-	0xf9, 0x51, 0xb5, 0xe5, 0x86, 0x91, 0x4a, 0x08, 0xa3, 0x1d, 0x55, 0xbc, 0x1c, 0x2b, 0x0c, 0xba,
10004
+-	0x1f, 0xf8, 0x61, 0x98, 0x3c, 0x00, 0x85, 0x7d, 0x98, 0x80, 0x1e, 0xef, 0x00, 0x44, 0x97, 0xa1,
10005
+-	0xd0, 0x09, 0x89, 0x0c, 0x24, 0xa5, 0xce, 0x6f, 0xa6, 0x19, 0x66, 0x10, 0xca, 0x9a, 0x6e, 0x29,
10006
+-	0xa5, 0xac, 0xc6, 0x9a, 0x72, 0x4d, 0x2b, 0x87, 0xd9, 0x5f, 0xcd, 0xc3, 0x85, 0x4c, 0x4b, 0x75,
10007
+-	0xda, 0xa5, 0x5d, 0xdf, 0x73, 0x23, 0x5f, 0xbd, 0x1a, 0xf2, 0x50, 0x26, 0xa4, 0xbd, 0xbd, 0x2a,
10008
+-	0xca, 0xb1, 0xc2, 0x40, 0x57, 0x64, 0x1a, 0xf6, 0x64, 0xca, 0x9b, 0xc5, 0x8a, 0x91, 0x89, 0x7d,
10009
+-	0xd0, 0x74, 0x62, 0x4f, 0x41, 0xa1, 0xed, 0xfb, 0xad, 0xe4, 0x61, 0x44, 0xbb, 0xeb, 0xfb, 0x2d,
10010
+-	0xcc, 0x80, 0xe8, 0x13, 0x62, 0x1c, 0x12, 0xcf, 0x64, 0xd8, 0x69, 0xfa, 0xa1, 0x36, 0x18, 0xcf,
10011
+-	0xc0, 0xc8, 0x0e, 0xd9, 0x0f, 0x5c, 0x6f, 0x2b, 0xf9, 0x7c, 0x7a, 0x93, 0x17, 0x63, 0x09, 0x37,
10012
+-	0x33, 0x3e, 0x8c, 0x9c, 0x74, 0x1e, 0xb0, 0x62, 0xdf, 0xab, 0xed, 0x07, 0xf2, 0x30, 0x89, 0x17,
10013
+-	0x2b, 0xdf, 0x9a, 0x88, 0x3b, 0xdd, 0x13, 0x71, 0xd2, 0x79, 0xc0, 0xfa, 0xcf, 0xc6, 0x2f, 0x5a,
10014
+-	0x30, 0xc9, 0xa2, 0x22, 0x8b, 0x00, 0x1a, 0xae, 0xef, 0x9d, 0x02, 0xeb, 0xf6, 0x14, 0x0c, 0x05,
10015
+-	0xb4, 0xd1, 0x64, 0x72, 0x1f, 0xd6, 0x13, 0xcc, 0x61, 0xe8, 0x09, 0x28, 0xb0, 0x2e, 0xd0, 0xc9,
10016
+-	0x1b, 0xe3, 0x79, 0x11, 0x2a, 0x4e, 0xe4, 0x60, 0x56, 0xca, 0xbc, 0xc2, 0x31, 0x69, 0xb7, 0x5c,
10017
+-	0xde, 0xe9, 0xf8, 0x49, 0xe2, 0xa3, 0xe1, 0x15, 0x9e, 0xda, 0xb5, 0x0f, 0xe6, 0x15, 0x9e, 0x4e,
10018
+-	0xb2, 0xb7, 0x58, 0xf4, 0xdf, 0x73, 0x70, 0x29, 0xb5, 0xde, 0xc0, 0x5e, 0xe1, 0xbd, 0x6b, 0x9f,
10019
+-	0x8c, 0x15, 0x4c, 0xba, 0x71, 0x4a, 0xfe, 0x14, 0x8d, 0x53, 0x0a, 0x83, 0x72, 0x8e, 0x43, 0x03,
10020
+-	0x38, 0x6b, 0xa7, 0x0e, 0xd9, 0x47, 0xc4, 0x59, 0x3b, 0xb5, 0x6f, 0x19, 0x62, 0xdd, 0x9f, 0xe6,
10021
+-	0x32, 0xbe, 0x85, 0x09, 0x78, 0x57, 0xe9, 0x39, 0xc3, 0x80, 0xa1, 0xe0, 0x84, 0xc7, 0xf8, 0x19,
10022
+-	0xc3, 0xcb, 0xb0, 0x82, 0x22, 0x57, 0x73, 0x7b, 0xce, 0x65, 0xa7, 0x7e, 0xcc, 0x6c, 0x6a, 0xce,
10023
+-	0x7c, 0x41, 0x52, 0x43, 0x90, 0xe2, 0x02, 0xbd, 0xaa, 0x09, 0xe5, 0xf9, 0xc1, 0x85, 0xf2, 0xb1,
10024
+-	0x74, 0x81, 0x1c, 0x2d, 0xc0, 0xe4, 0xae, 0xeb, 0xb1, 0x54, 0xfe, 0x26, 0x2b, 0xaa, 0xa2, 0x80,
10025
+-	0xac, 0x9a, 0x60, 0x9c, 0xc4, 0x9f, 0x7d, 0x0d, 0xc6, 0x1f, 0x5e, 0x1d, 0xf9, 0x8d, 0x3c, 0x3c,
10026
+-	0xde, 0x63, 0xdb, 0xf3, 0xb3, 0xde, 0x98, 0x03, 0xed, 0xac, 0xef, 0x9a, 0x87, 0x1a, 0x9c, 0xdd,
10027
+-	0xec, 0xb4, 0x5a, 0xfb, 0xcc, 0xfe, 0x93, 0x34, 0x25, 0x86, 0xe0, 0x15, 0x9f, 0x90, 0x99, 0x28,
10028
+-	0x56, 0x52, 0x70, 0x70, 0x6a, 0x4d, 0xf4, 0x26, 0x20, 0x5f, 0xe4, 0x9d, 0xbd, 0x4e, 0x3c, 0xa1,
10029
+-	0x97, 0x67, 0x03, 0x9f, 0x8f, 0x37, 0xe3, 0xed, 0x2e, 0x0c, 0x9c, 0x52, 0x8b, 0x32, 0xfd, 0xf4,
10030
+-	0x56, 0xda, 0x57, 0xdd, 0x4a, 0x30, 0xfd, 0x58, 0x07, 0x62, 0x13, 0x17, 0x5d, 0x87, 0x69, 0x67,
10031
+-	0xcf, 0x71, 0x79, 0x74, 0x3c, 0x49, 0x80, 0x73, 0xfd, 0x4a, 0x09, 0xb6, 0x90, 0x44, 0xc0, 0xdd,
10032
+-	0x75, 0x12, 0x8e, 0xd1, 0xc3, 0xd9, 0x8e, 0xd1, 0xbd, 0xcf, 0xc5, 0x7e, 0x3a, 0x5d, 0xfb, 0x3f,
10033
+-	0x58, 0xf4, 0xfa, 0x4a, 0xc9, 0x1d, 0x4f, 0xc7, 0x41, 0xe9, 0x26, 0x35, 0x1f, 0xe5, 0x73, 0x9a,
10034
+-	0x85, 0x47, 0x0c, 0xc4, 0x26, 0x2e, 0x5f, 0x10, 0x61, 0xec, 0x24, 0x63, 0xb0, 0xee, 0x22, 0xc6,
10035
+-	0x81, 0xc2, 0x40, 0x9f, 0x87, 0x91, 0xa6, 0xbb, 0xe7, 0x86, 0x7e, 0x20, 0x36, 0xcb, 0x31, 0x5d,
10036
+-	0x0d, 0xe2, 0x73, 0xb0, 0xc2, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0x81, 0x1c, 0x8c, 0xcb, 0x16, 0xdf,
10037
+-	0xea, 0xf8, 0x91, 0x73, 0x0a, 0xd7, 0xf2, 0x75, 0xe3, 0x5a, 0xfe, 0x44, 0xaf, 0x40, 0x0f, 0xac,
10038
+-	0x4b, 0x99, 0xd7, 0xf1, 0xed, 0xc4, 0x75, 0xfc, 0x74, 0x7f, 0x52, 0xbd, 0xaf, 0xe1, 0x7f, 0x6a,
10039
+-	0xc1, 0xb4, 0x81, 0x7f, 0x0a, 0xb7, 0xc1, 0x8a, 0x79, 0x1b, 0x3c, 0xd9, 0xf7, 0x1b, 0x32, 0x6e,
10040
+-	0x81, 0xef, 0xcb, 0x27, 0xfa, 0xce, 0x4e, 0xff, 0xf7, 0xa0, 0xb0, 0xed, 0x04, 0xcd, 0x5e, 0x01,
10041
+-	0x65, 0xbb, 0x2a, 0xcd, 0xdd, 0x70, 0x82, 0x26, 0x3f, 0xc3, 0x9f, 0x53, 0xd9, 0x2a, 0x9d, 0xa0,
10042
+-	0xd9, 0xd7, 0x27, 0x8c, 0x35, 0x85, 0x5e, 0x85, 0xe1, 0xb0, 0xe1, 0xb7, 0x95, 0xc5, 0xe6, 0x65,
10043
+-	0x9e, 0xc9, 0x92, 0x96, 0x1c, 0x1d, 0x94, 0x91, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x1f, 0xbd, 0x0d,
10044
+-	0xe3, 0xec, 0x97, 0xb2, 0x5c, 0xc8, 0x67, 0xa7, 0x31, 0xa8, 0xeb, 0x88, 0xdc, 0x00, 0xc6, 0x28,
10045
+-	0xc2, 0x26, 0xa9, 0xd9, 0x2d, 0x28, 0xa9, 0xcf, 0x7a, 0xa4, 0xbe, 0x3c, 0xff, 0x36, 0x0f, 0x67,
10046
+-	0x52, 0xd6, 0x1c, 0x0a, 0x8d, 0x99, 0x78, 0x61, 0xc0, 0xa5, 0xfa, 0x01, 0xe7, 0x22, 0x64, 0xd2,
10047
+-	0x50, 0x53, 0xac, 0xad, 0x81, 0x1b, 0xbd, 0x13, 0x92, 0x64, 0xa3, 0xb4, 0xa8, 0x7f, 0xa3, 0xb4,
10048
+-	0xb1, 0x53, 0x1b, 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x23, 0x9d, 0xd3, 0x3f, 0xca, 0xc3, 0xd9, 0xb4,
10049
+-	0xd8, 0x33, 0xe8, 0xbb, 0x13, 0x29, 0x6d, 0x5e, 0x1a, 0x34, 0x6a, 0x0d, 0xcf, 0x73, 0x23, 0x12,
10050
+-	0x34, 0xcf, 0x99, 0x49, 0x6e, 0xfa, 0x0e, 0xb3, 0x68, 0x93, 0x39, 0x80, 0x06, 0x3c, 0x15, 0x91,
10051
+-	0x3c, 0x3e, 0x3e, 0x3d, 0x70, 0x07, 0x44, 0x0e, 0xa3, 0x30, 0xe1, 0x00, 0x2a, 0x8b, 0xfb, 0x3b,
10052
+-	0x80, 0xca, 0x96, 0x67, 0x5d, 0x18, 0xd5, 0xbe, 0xe6, 0x91, 0xce, 0xf8, 0x0e, 0xbd, 0xad, 0xb4,
10053
+-	0x7e, 0x3f, 0xd2, 0x59, 0xff, 0x51, 0x0b, 0x12, 0xe6, 0x91, 0x4a, 0xdd, 0x65, 0x65, 0xaa, 0xbb,
10054
+-	0x2e, 0x43, 0x21, 0xf0, 0x5b, 0x24, 0x99, 0x41, 0x06, 0xfb, 0x2d, 0x82, 0x19, 0x84, 0x62, 0x44,
10055
+-	0xb1, 0xb2, 0x63, 0x4c, 0x17, 0xe4, 0x84, 0x88, 0xf6, 0x14, 0x0c, 0xb5, 0xc8, 0x1e, 0x69, 0x25,
10056
+-	0xc3, 0xb3, 0xdf, 0xa2, 0x85, 0x98, 0xc3, 0xec, 0x5f, 0x2c, 0xc0, 0xc5, 0x9e, 0x2e, 0xd4, 0x54,
10057
+-	0x1c, 0xda, 0x72, 0x22, 0x72, 0xdf, 0xd9, 0x4f, 0xc6, 0x51, 0xbe, 0xce, 0x8b, 0xb1, 0x84, 0x33,
10058
+-	0x8b, 0x71, 0x1e, 0x37, 0x31, 0xa1, 0x1c, 0x14, 0xe1, 0x12, 0x05, 0xf4, 0x11, 0x24, 0xa7, 0xbf,
10059
+-	0x06, 0x10, 0x86, 0xad, 0x65, 0x8f, 0x72, 0x77, 0x4d, 0x61, 0x8a, 0x1e, 0xc7, 0xd7, 0xac, 0xdf,
10060
+-	0x12, 0x10, 0xac, 0x61, 0xa1, 0x0a, 0x4c, 0xb5, 0x03, 0x3f, 0xe2, 0xba, 0xd6, 0x0a, 0x37, 0x14,
10061
+-	0x1a, 0x32, 0xbd, 0x57, 0x6b, 0x09, 0x38, 0xee, 0xaa, 0x81, 0x5e, 0x86, 0x51, 0xe1, 0xd1, 0x5a,
10062
+-	0xf3, 0xfd, 0x96, 0x50, 0x03, 0x29, 0xb3, 0x93, 0x7a, 0x0c, 0xc2, 0x3a, 0x9e, 0x56, 0x8d, 0x29,
10063
+-	0x70, 0x47, 0x52, 0xab, 0x71, 0x25, 0xae, 0x86, 0x97, 0x88, 0x43, 0x55, 0x1c, 0x28, 0x0e, 0x55,
10064
+-	0xac, 0x18, 0x2b, 0x0d, 0xfc, 0x66, 0x05, 0x7d, 0x55, 0x49, 0x3f, 0x57, 0x80, 0x33, 0x62, 0xe1,
10065
+-	0x3c, 0xea, 0xe5, 0xf2, 0x88, 0x52, 0xe8, 0x7f, 0x6b, 0xcd, 0x9c, 0xf6, 0x9a, 0xf9, 0x41, 0x0b,
10066
+-	0x4c, 0xf6, 0x0a, 0xfd, 0xb9, 0xcc, 0x40, 0xf4, 0x2f, 0x67, 0xb2, 0x6b, 0x4d, 0x79, 0x81, 0x7c,
10067
+-	0xc0, 0x90, 0xf4, 0xf6, 0xbf, 0xb7, 0xe0, 0xc9, 0xbe, 0x14, 0xd1, 0x32, 0x94, 0x18, 0x0f, 0xa8,
10068
+-	0x49, 0x67, 0x4f, 0x2b, 0x43, 0x42, 0x09, 0xc8, 0x60, 0x49, 0xe3, 0x9a, 0x68, 0xb9, 0x2b, 0xe2,
10069
+-	0xff, 0x33, 0x29, 0x11, 0xff, 0xcf, 0x19, 0xc3, 0xf3, 0x90, 0x21, 0xff, 0x7f, 0x25, 0x0f, 0xc3,
10070
+-	0x7c, 0xc5, 0x9f, 0x82, 0x18, 0xb6, 0x22, 0xf4, 0xb6, 0x3d, 0x22, 0x51, 0xf1, 0xbe, 0xcc, 0x55,
10071
+-	0x9c, 0xc8, 0xe1, 0x6c, 0x82, 0xba, 0xad, 0x62, 0x0d, 0x2f, 0x9a, 0x33, 0xee, 0xb3, 0xd9, 0x84,
10072
+-	0x62, 0x12, 0x38, 0x0d, 0xed, 0x76, 0xfb, 0x22, 0x40, 0xc8, 0xb2, 0xe5, 0x53, 0x1a, 0x22, 0xa6,
10073
+-	0xd9, 0x27, 0x7b, 0xb4, 0x5e, 0x57, 0xc8, 0xbc, 0x0f, 0xf1, 0x4e, 0x57, 0x00, 0xac, 0x51, 0x9c,
10074
+-	0x7d, 0x05, 0x4a, 0x0a, 0xb9, 0x9f, 0x16, 0x67, 0x4c, 0x67, 0x2e, 0x3e, 0x0b, 0x93, 0x89, 0xb6,
10075
+-	0x8e, 0xa5, 0x04, 0xfa, 0x25, 0x0b, 0x26, 0x79, 0x97, 0x97, 0xbd, 0x3d, 0x71, 0xa6, 0xbe, 0x0f,
10076
+-	0x67, 0x5b, 0x29, 0x67, 0x9b, 0x98, 0xd1, 0xc1, 0xcf, 0x42, 0xa5, 0xf4, 0x49, 0x83, 0xe2, 0xd4,
10077
+-	0x36, 0xd0, 0x55, 0xba, 0x6e, 0xe9, 0xd9, 0xe5, 0xb4, 0x84, 0xf7, 0xd1, 0x18, 0x5f, 0xb3, 0xbc,
10078
+-	0x0c, 0x2b, 0xa8, 0xfd, 0x3b, 0x16, 0x4c, 0xf3, 0x9e, 0xdf, 0x24, 0xfb, 0x6a, 0x87, 0x7f, 0x98,
10079
+-	0x7d, 0x17, 0x49, 0x38, 0x72, 0x19, 0x49, 0x38, 0xf4, 0x4f, 0xcb, 0xf7, 0xfc, 0xb4, 0x9f, 0xb5,
10080
+-	0x40, 0xac, 0xc0, 0x53, 0x10, 0xe5, 0xbf, 0xdd, 0x14, 0xe5, 0x67, 0xb3, 0x17, 0x75, 0x86, 0x0c,
10081
+-	0xff, 0x27, 0x16, 0x4c, 0x71, 0x84, 0xf8, 0x2d, 0xf9, 0x43, 0x9d, 0x87, 0x41, 0xb2, 0xe9, 0xa9,
10082
+-	0x14, 0xdb, 0xe9, 0x1f, 0x65, 0x4c, 0x56, 0xa1, 0xe7, 0x64, 0x35, 0xe5, 0x06, 0x3a, 0x46, 0x26,
10083
+-	0xc9, 0x63, 0x07, 0xb3, 0xb6, 0xff, 0xd0, 0x02, 0xc4, 0x9b, 0x31, 0xd8, 0x1f, 0xca, 0x54, 0xb0,
10084
+-	0x52, 0xed, 0xba, 0x88, 0x8f, 0x1a, 0x05, 0xc1, 0x1a, 0xd6, 0x89, 0x0c, 0x4f, 0xc2, 0x20, 0x20,
10085
+-	0xdf, 0xdf, 0x20, 0xe0, 0x18, 0x23, 0xfa, 0x7f, 0x0a, 0x90, 0x74, 0x07, 0x40, 0x77, 0x61, 0xac,
10086
+-	0xe1, 0xb4, 0x9d, 0x0d, 0xb7, 0xe5, 0x46, 0x2e, 0x09, 0x7b, 0x59, 0x12, 0x2d, 0x69, 0x78, 0xe2,
10087
+-	0xa9, 0x57, 0x2b, 0xc1, 0x06, 0x1d, 0x34, 0x07, 0xd0, 0x0e, 0xdc, 0x3d, 0xb7, 0x45, 0xb6, 0x98,
10088
+-	0xc6, 0x81, 0xf9, 0x3b, 0x72, 0xf3, 0x18, 0x59, 0x8a, 0x35, 0x8c, 0x14, 0xd7, 0xb5, 0xfc, 0xa3,
10089
+-	0x73, 0x5d, 0x2b, 0x1c, 0xd3, 0x75, 0x6d, 0x68, 0x20, 0xd7, 0x35, 0x0c, 0xe7, 0x25, 0x8b, 0x44,
10090
+-	0xff, 0xaf, 0xb8, 0x2d, 0x22, 0xf8, 0x62, 0xee, 0x05, 0x39, 0x7b, 0x78, 0x50, 0x3e, 0x8f, 0x53,
10091
+-	0x31, 0x70, 0x46, 0x4d, 0xf4, 0x39, 0x98, 0x71, 0x5a, 0x2d, 0xff, 0xbe, 0x1a, 0xb5, 0xe5, 0xb0,
10092
+-	0xe1, 0xb4, 0xb8, 0xc6, 0x7e, 0x84, 0x51, 0x7d, 0xe2, 0xf0, 0xa0, 0x3c, 0xb3, 0x90, 0x81, 0x83,
10093
+-	0x33, 0x6b, 0x27, 0x3c, 0xdf, 0x8a, 0x7d, 0x3d, 0xdf, 0x5e, 0x87, 0x52, 0x3b, 0xf0, 0x1b, 0xab,
10094
+-	0x9a, 0x37, 0xce, 0x25, 0x96, 0xa7, 0x5e, 0x16, 0x1e, 0x1d, 0x94, 0xc7, 0xd5, 0x1f, 0x76, 0xc3,
10095
+-	0xc7, 0x15, 0xec, 0x1d, 0x38, 0x53, 0x27, 0x81, 0xcb, 0x32, 0x60, 0x36, 0xe3, 0x0d, 0xbd, 0x0e,
10096
+-	0xa5, 0x20, 0x71, 0x84, 0x0d, 0x14, 0x58, 0x49, 0x8b, 0xf2, 0x2b, 0x8f, 0xac, 0x98, 0x90, 0xfd,
10097
+-	0xc7, 0x16, 0x8c, 0x08, 0x87, 0x86, 0x53, 0xe0, 0x9c, 0x16, 0x0c, 0x05, 0x76, 0x39, 0xfd, 0x98,
10098
+-	0x67, 0x9d, 0xc9, 0x54, 0x5d, 0x57, 0x13, 0xaa, 0xeb, 0x27, 0x7b, 0x11, 0xe9, 0xad, 0xb4, 0xfe,
10099
+-	0x9b, 0x79, 0x98, 0x30, 0x9d, 0x39, 0x4e, 0x61, 0x08, 0xd6, 0x60, 0x24, 0x14, 0x9e, 0x43, 0xb9,
10100
+-	0x6c, 0xcb, 0xe9, 0xe4, 0x24, 0xc6, 0x66, 0x51, 0xc2, 0x57, 0x48, 0x12, 0x49, 0x75, 0x49, 0xca,
10101
+-	0x3f, 0x42, 0x97, 0xa4, 0x7e, 0xfe, 0x34, 0x85, 0x93, 0xf0, 0xa7, 0xb1, 0xbf, 0xc6, 0xae, 0x1a,
10102
+-	0xbd, 0xfc, 0x14, 0xb8, 0x90, 0xeb, 0xe6, 0xa5, 0x64, 0xf7, 0x58, 0x59, 0xa2, 0x53, 0x19, 0xdc,
10103
+-	0xc8, 0x2f, 0x58, 0x70, 0x31, 0xe5, 0xab, 0x34, 0xd6, 0xe4, 0x39, 0x28, 0x3a, 0x9d, 0xa6, 0xab,
10104
+-	0xf6, 0xb2, 0xf6, 0x8c, 0xb5, 0x20, 0xca, 0xb1, 0xc2, 0x40, 0x4b, 0x30, 0x4d, 0x1e, 0xb4, 0x5d,
10105
+-	0xfe, 0x8e, 0xa8, 0xdb, 0x2e, 0xe6, 0x79, 0x88, 0xd9, 0xe5, 0x24, 0x10, 0x77, 0xe3, 0x2b, 0x77,
10106
+-	0xec, 0x7c, 0xa6, 0x3b, 0xf6, 0x3f, 0xb0, 0x60, 0x54, 0x74, 0xfb, 0x14, 0x46, 0xfb, 0x3b, 0xcc,
10107
+-	0xd1, 0x7e, 0xbc, 0xc7, 0x68, 0x67, 0x0c, 0xf3, 0xdf, 0xce, 0xa9, 0xfe, 0xd6, 0xfc, 0x20, 0x1a,
10108
+-	0x80, 0xe5, 0x79, 0x15, 0x8a, 0xed, 0xc0, 0x8f, 0xfc, 0x86, 0xdf, 0x12, 0x1c, 0xcf, 0x13, 0x71,
10109
+-	0xb4, 0x00, 0x5e, 0x7e, 0xa4, 0xfd, 0xc6, 0x0a, 0x9b, 0x8d, 0x9e, 0x1f, 0x44, 0x82, 0xcb, 0x88,
10110
+-	0x47, 0xcf, 0x0f, 0x22, 0xcc, 0x20, 0xa8, 0x09, 0x10, 0x39, 0xc1, 0x16, 0x89, 0x68, 0x99, 0x08,
10111
+-	0x3c, 0x92, 0x7d, 0x78, 0x74, 0x22, 0xb7, 0x35, 0xe7, 0x7a, 0x51, 0x18, 0x05, 0x73, 0x55, 0x2f,
10112
+-	0xba, 0x1d, 0x70, 0x01, 0x4a, 0x73, 0xff, 0x57, 0xb4, 0xb0, 0x46, 0x57, 0xfa, 0x68, 0xb2, 0x36,
10113
+-	0x86, 0xcc, 0x07, 0xf1, 0x35, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x0a, 0xbb, 0x4a, 0xd8, 0x00, 0x1d,
10114
+-	0xcf, 0x33, 0xff, 0xeb, 0x45, 0x35, 0xb4, 0xec, 0x35, 0xac, 0xa2, 0xfb, 0xff, 0xf7, 0x3e, 0xb9,
10115
+-	0x69, 0xc3, 0xba, 0x1f, 0x4d, 0x1c, 0x24, 0x00, 0x7d, 0x67, 0x97, 0x9d, 0xc4, 0xf3, 0x7d, 0xae,
10116
+-	0x80, 0x63, 0x58, 0x46, 0xb0, 0xb0, 0xd7, 0x2c, 0x3c, 0x70, 0xb5, 0x26, 0x16, 0xb9, 0x16, 0xf6,
10117
+-	0x5a, 0x00, 0x70, 0x8c, 0x83, 0xe6, 0x85, 0xf8, 0x5d, 0x30, 0x92, 0xdf, 0x49, 0xf1, 0x5b, 0x7e,
10118
+-	0xbe, 0x26, 0x7f, 0xbf, 0x00, 0xa3, 0x2a, 0x09, 0x5e, 0x8d, 0xe7, 0x12, 0x13, 0x61, 0x58, 0x96,
10119
+-	0xe3, 0x62, 0xac, 0xe3, 0xa0, 0x75, 0x98, 0x0c, 0xb9, 0xee, 0x45, 0x45, 0xdb, 0xe3, 0x3a, 0xac,
10120
+-	0x4f, 0x4a, 0xfb, 0x8a, 0xba, 0x09, 0x3e, 0x62, 0x45, 0xfc, 0xe8, 0x90, 0x8e, 0x96, 0x49, 0x12,
10121
+-	0xe8, 0x0d, 0x98, 0x68, 0xe9, 0xe9, 0xe6, 0x6b, 0x42, 0xc5, 0xa5, 0xcc, 0x8f, 0x8d, 0x64, 0xf4,
10122
+-	0x35, 0x9c, 0xc0, 0xa6, 0x9c, 0x92, 0x5e, 0x22, 0x22, 0x44, 0x3a, 0xde, 0x16, 0x09, 0x45, 0x0a,
10123
+-	0x2f, 0xc6, 0x29, 0xdd, 0xca, 0xc0, 0xc1, 0x99, 0xb5, 0xd1, 0xab, 0x30, 0x26, 0x3f, 0x5f, 0x73,
10124
+-	0x23, 0x8e, 0x8d, 0xdc, 0x35, 0x18, 0x36, 0x30, 0xd1, 0x7d, 0x38, 0x27, 0xff, 0xaf, 0x07, 0xce,
10125
+-	0xe6, 0xa6, 0xdb, 0x10, 0x5e, 0xdc, 0xdc, 0xd3, 0x67, 0x41, 0xba, 0x0e, 0x2d, 0xa7, 0x21, 0x1d,
10126
+-	0x1d, 0x94, 0x2f, 0x8b, 0x51, 0x4b, 0x85, 0xb3, 0x49, 0x4c, 0xa7, 0x8f, 0x56, 0xe1, 0xcc, 0x36,
10127
+-	0x71, 0x5a, 0xd1, 0xf6, 0xd2, 0x36, 0x69, 0xec, 0xc8, 0x4d, 0xc4, 0x9c, 0x93, 0x35, 0xd3, 0xf0,
10128
+-	0x1b, 0xdd, 0x28, 0x38, 0xad, 0x1e, 0x7a, 0x07, 0x66, 0xda, 0x9d, 0x8d, 0x96, 0x1b, 0x6e, 0xaf,
10129
+-	0xf9, 0x11, 0x33, 0xe9, 0x50, 0x39, 0xe4, 0x84, 0x17, 0xb3, 0x72, 0xcc, 0xae, 0x65, 0xe0, 0xe1,
10130
+-	0x4c, 0x0a, 0xe8, 0x7d, 0x38, 0x97, 0x58, 0x0c, 0xc2, 0xa7, 0x72, 0x22, 0x3b, 0xde, 0x6e, 0x3d,
10131
+-	0xad, 0x82, 0xf0, 0x91, 0x4c, 0x03, 0xe1, 0xf4, 0x26, 0x3e, 0x98, 0xa1, 0xcf, 0x7b, 0xb4, 0xb2,
10132
+-	0xc6, 0x94, 0xa1, 0x2f, 0xc1, 0x98, 0xbe, 0x8a, 0xc4, 0x05, 0x73, 0x25, 0x9d, 0x67, 0xd1, 0x56,
10133
+-	0x1b, 0x67, 0xe9, 0xd4, 0x8a, 0xd2, 0x61, 0xd8, 0xa0, 0x68, 0x13, 0x48, 0xff, 0x3e, 0x74, 0x0b,
10134
+-	0x8a, 0x8d, 0x96, 0x4b, 0xbc, 0xa8, 0x5a, 0xeb, 0x15, 0xf4, 0x63, 0x49, 0xe0, 0x88, 0x01, 0x13,
10135
+-	0x01, 0x4a, 0x79, 0x19, 0x56, 0x14, 0xec, 0x5f, 0xcf, 0x41, 0xb9, 0x4f, 0xb4, 0xdb, 0x84, 0x3e,
10136
+-	0xda, 0x1a, 0x48, 0x1f, 0xbd, 0x20, 0x33, 0xe2, 0xad, 0x25, 0x84, 0xf4, 0x44, 0xb6, 0xbb, 0x58,
10137
+-	0x54, 0x4f, 0xe2, 0x0f, 0x6c, 0x1f, 0xac, 0xab, 0xb4, 0x0b, 0x7d, 0x2d, 0xd7, 0x8d, 0xa7, 0xac,
10138
+-	0xa1, 0xc1, 0x05, 0x91, 0xcc, 0x67, 0x09, 0xfb, 0x6b, 0x39, 0x38, 0xa7, 0x86, 0xf0, 0x9b, 0x77,
10139
+-	0xe0, 0xee, 0x74, 0x0f, 0xdc, 0x09, 0x3c, 0xea, 0xd8, 0xb7, 0x61, 0x98, 0x07, 0x4d, 0x19, 0x80,
10140
+-	0x01, 0x7a, 0xca, 0x8c, 0xb0, 0xa5, 0xae, 0x69, 0x23, 0xca, 0xd6, 0x5f, 0xb2, 0x60, 0x72, 0x7d,
10141
+-	0xa9, 0x56, 0xf7, 0x1b, 0x3b, 0x24, 0x5a, 0xe0, 0x0c, 0x2b, 0x16, 0xfc, 0x8f, 0xf5, 0x90, 0x7c,
10142
+-	0x4d, 0x1a, 0xc7, 0x74, 0x19, 0x0a, 0xdb, 0x7e, 0x18, 0x25, 0x5f, 0x7c, 0x6f, 0xf8, 0x61, 0x84,
10143
+-	0x19, 0xc4, 0xfe, 0x5d, 0x0b, 0x86, 0x58, 0x1e, 0xd7, 0x7e, 0xc9, 0x85, 0x07, 0xf9, 0x2e, 0xf4,
10144
+-	0x32, 0x0c, 0x93, 0xcd, 0x4d, 0xd2, 0x88, 0xc4, 0xac, 0x4a, 0x77, 0xd4, 0xe1, 0x65, 0x56, 0x4a,
10145
+-	0x2f, 0x7d, 0xd6, 0x18, 0xff, 0x8b, 0x05, 0x32, 0xba, 0x07, 0xa5, 0xc8, 0xdd, 0x25, 0x0b, 0xcd,
10146
+-	0xa6, 0x78, 0x33, 0x7b, 0x08, 0xef, 0xdf, 0x75, 0x49, 0x00, 0xc7, 0xb4, 0xec, 0xaf, 0xe6, 0x00,
10147
+-	0x62, 0xd7, 0xff, 0x7e, 0x9f, 0xb8, 0xd8, 0xf5, 0x9a, 0x72, 0x25, 0xe5, 0x35, 0x05, 0xc5, 0x04,
10148
+-	0x53, 0x9e, 0x52, 0xd4, 0x30, 0xe5, 0x07, 0x1a, 0xa6, 0xc2, 0x71, 0x86, 0x69, 0x09, 0xa6, 0xe3,
10149
+-	0xd0, 0x05, 0x66, 0x1c, 0x17, 0x26, 0xa4, 0xac, 0x27, 0x81, 0xb8, 0x1b, 0xdf, 0x26, 0x70, 0x59,
10150
+-	0x46, 0xd4, 0x94, 0x77, 0x0d, 0x33, 0xc9, 0x3c, 0x46, 0x9e, 0xe9, 0xf8, 0xb9, 0x28, 0x97, 0xf9,
10151
+-	0x5c, 0xf4, 0x13, 0x16, 0x9c, 0x4d, 0xb6, 0xc3, 0x7c, 0xdf, 0xbe, 0x62, 0xc1, 0x39, 0xf6, 0x68,
10152
+-	0xc6, 0x5a, 0xed, 0x7e, 0xa2, 0x7b, 0x29, 0x3d, 0xa4, 0x43, 0xef, 0x1e, 0xc7, 0x7e, 0xcf, 0xab,
10153
+-	0x69, 0xa4, 0x71, 0x7a, 0x8b, 0xf6, 0x57, 0x2c, 0xb8, 0x90, 0x99, 0x3e, 0x08, 0x5d, 0x85, 0xa2,
10154
+-	0xd3, 0x76, 0xb9, 0x46, 0x4a, 0xec, 0x77, 0x26, 0x3d, 0xd6, 0xaa, 0x5c, 0x1f, 0xa5, 0xa0, 0x2a,
10155
+-	0xad, 0x61, 0x2e, 0x33, 0xad, 0x61, 0xdf, 0x2c, 0x85, 0xf6, 0xf7, 0x5b, 0x20, 0xdc, 0x9d, 0x06,
10156
+-	0x38, 0x64, 0xde, 0x96, 0x59, 0x61, 0x8d, 0x60, 0xe6, 0x97, 0xb3, 0xfd, 0xbf, 0x44, 0x08, 0x73,
10157
+-	0x75, 0xa9, 0x1b, 0x81, 0xcb, 0x0d, 0x5a, 0x76, 0x13, 0x04, 0xb4, 0x42, 0x98, 0xce, 0xaa, 0x7f,
10158
+-	0x6f, 0xae, 0x01, 0x34, 0x19, 0xae, 0x96, 0x1b, 0x52, 0x5d, 0x21, 0x15, 0x05, 0xc1, 0x1a, 0x96,
10159
+-	0xfd, 0x43, 0x39, 0x18, 0x95, 0xc1, 0xb3, 0x3b, 0xde, 0x20, 0x92, 0xe5, 0xb1, 0x72, 0xe8, 0xb0,
10160
+-	0x64, 0xaa, 0x94, 0x70, 0x2d, 0x16, 0xc8, 0xe3, 0x64, 0xaa, 0x12, 0x80, 0x63, 0x1c, 0xf4, 0x0c,
10161
+-	0x8c, 0x84, 0x9d, 0x0d, 0x86, 0x9e, 0x70, 0xe2, 0xa9, 0xf3, 0x62, 0x2c, 0xe1, 0xe8, 0x73, 0x30,
10162
+-	0xc5, 0xeb, 0x05, 0x7e, 0xdb, 0xd9, 0xe2, 0xea, 0xcf, 0x21, 0xe5, 0x55, 0x3b, 0xb5, 0x9a, 0x80,
10163
+-	0x1d, 0x1d, 0x94, 0xcf, 0x26, 0xcb, 0x98, 0xe2, 0xbc, 0x8b, 0x8a, 0xfd, 0x25, 0x40, 0xdd, 0xf1,
10164
+-	0xc0, 0xd1, 0x9b, 0xdc, 0x94, 0xca, 0x0d, 0x48, 0xb3, 0x97, 0x46, 0x5c, 0x77, 0x02, 0x95, 0x86,
10165
+-	0xf4, 0xbc, 0x16, 0x56, 0xf5, 0xed, 0xbf, 0x9a, 0x87, 0xa9, 0xa4, 0x4b, 0x20, 0xba, 0x01, 0xc3,
10166
+-	0xfc, 0xb2, 0x13, 0xe4, 0x7b, 0x3c, 0xb8, 0x6a, 0x8e, 0x84, 0x6c, 0xdb, 0x8b, 0xfb, 0x52, 0xd4,
10167
+-	0x47, 0xef, 0xc0, 0x68, 0xd3, 0xbf, 0xef, 0xdd, 0x77, 0x82, 0xe6, 0x42, 0xad, 0x2a, 0xd6, 0x65,
10168
+-	0x2a, 0xcf, 0x5c, 0x89, 0xd1, 0x74, 0xe7, 0x44, 0xf6, 0xb8, 0x10, 0x83, 0xb0, 0x4e, 0x0e, 0xad,
10169
+-	0xb3, 0x18, 0x87, 0x9b, 0xee, 0xd6, 0xaa, 0xd3, 0xee, 0x65, 0x57, 0xbb, 0x24, 0x91, 0x34, 0xca,
10170
+-	0xe3, 0x22, 0x10, 0x22, 0x07, 0xe0, 0x98, 0x10, 0xfa, 0x6e, 0x38, 0x13, 0x66, 0xa8, 0xd9, 0xb2,
10171
+-	0xd2, 0x43, 0xf4, 0xd2, 0x3c, 0x2d, 0x3e, 0x46, 0xa5, 0x99, 0x34, 0x85, 0x5c, 0x5a, 0x33, 0xf6,
10172
+-	0x97, 0xcf, 0x80, 0xb1, 0x1b, 0x8d, 0x1c, 0x41, 0xd6, 0x09, 0xe5, 0x08, 0xc2, 0x50, 0x24, 0xbb,
10173
+-	0xed, 0x68, 0xbf, 0xe2, 0x06, 0xbd, 0x72, 0xd8, 0x2d, 0x0b, 0x9c, 0x6e, 0x9a, 0x12, 0x82, 0x15,
10174
+-	0x9d, 0xf4, 0x44, 0x4e, 0xf9, 0x0f, 0x31, 0x91, 0x53, 0xe1, 0x14, 0x13, 0x39, 0xad, 0xc1, 0xc8,
10175
+-	0x96, 0x1b, 0x61, 0xd2, 0xf6, 0x05, 0x9b, 0x99, 0xba, 0x0e, 0xaf, 0x73, 0x94, 0xee, 0xe4, 0x21,
10176
+-	0x02, 0x80, 0x25, 0x11, 0xf4, 0xa6, 0xda, 0x81, 0xc3, 0xd9, 0x52, 0x5a, 0xf7, 0xcb, 0x60, 0xea,
10177
+-	0x1e, 0x14, 0x89, 0x9b, 0x46, 0x1e, 0x36, 0x71, 0xd3, 0x8a, 0x4c, 0xb7, 0x54, 0xcc, 0x36, 0x82,
10178
+-	0x67, 0xd9, 0x94, 0xfa, 0x24, 0x59, 0x32, 0x12, 0x53, 0x95, 0x4e, 0x2e, 0x31, 0xd5, 0xf7, 0x5b,
10179
+-	0x70, 0xae, 0x9d, 0x96, 0xa3, 0x4d, 0x24, 0x49, 0x7a, 0x79, 0xe0, 0x24, 0x74, 0x46, 0x83, 0x4c,
10180
+-	0x5c, 0x4f, 0x45, 0xc3, 0xe9, 0xcd, 0xd1, 0x81, 0x0e, 0x36, 0x9a, 0x22, 0xb3, 0xd2, 0x53, 0x19,
10181
+-	0x19, 0xae, 0x7a, 0xe4, 0xb5, 0x5a, 0x4f, 0xc9, 0xa6, 0xf4, 0xf1, 0xac, 0x6c, 0x4a, 0x03, 0xe7,
10182
+-	0x50, 0x7a, 0x53, 0xe5, 0xb6, 0x1a, 0xcf, 0x5e, 0x4a, 0x3c, 0x73, 0x55, 0xdf, 0x8c, 0x56, 0x6f,
10183
+-	0xaa, 0x8c, 0x56, 0x3d, 0x62, 0xbd, 0xf1, 0x7c, 0x55, 0x7d, 0xf3, 0x58, 0x69, 0xb9, 0xa8, 0x26,
10184
+-	0x4f, 0x26, 0x17, 0x95, 0x71, 0xd5, 0xf0, 0x74, 0x48, 0xcf, 0xf6, 0xb9, 0x6a, 0x0c, 0xba, 0xbd,
10185
+-	0x2f, 0x1b, 0x9e, 0x77, 0x6b, 0xfa, 0xa1, 0xf2, 0x6e, 0xdd, 0xd5, 0xf3, 0x58, 0xa1, 0x3e, 0x89,
10186
+-	0x9a, 0x28, 0xd2, 0x80, 0xd9, 0xab, 0xee, 0xea, 0x17, 0xe0, 0x99, 0x6c, 0xba, 0xea, 0x9e, 0xeb,
10187
+-	0xa6, 0x9b, 0x7a, 0x05, 0x76, 0x65, 0xc5, 0x3a, 0x7b, 0x3a, 0x59, 0xb1, 0xce, 0x9d, 0x78, 0x56,
10188
+-	0xac, 0xf3, 0xa7, 0x90, 0x15, 0xeb, 0xb1, 0x0f, 0x35, 0x2b, 0xd6, 0xcc, 0x23, 0xc8, 0x8a, 0xb5,
10189
+-	0x16, 0x67, 0xc5, 0xba, 0x90, 0x3d, 0x25, 0x29, 0x96, 0xb9, 0x19, 0xb9, 0xb0, 0xee, 0xb2, 0xe7,
10190
+-	0x79, 0x1e, 0xb3, 0x42, 0x04, 0xa3, 0x4b, 0xcf, 0xfb, 0x9b, 0x16, 0xd8, 0x82, 0x4f, 0x89, 0x02,
10191
+-	0xe1, 0x98, 0x14, 0xa5, 0x1b, 0xe7, 0xc6, 0x7a, 0xbc, 0x87, 0x42, 0x36, 0x4d, 0xd5, 0x95, 0x9d,
10192
+-	0x11, 0xcb, 0xfe, 0xcb, 0x39, 0xb8, 0xd4, 0x7b, 0x5d, 0xc7, 0x7a, 0xb2, 0x5a, 0xfc, 0xae, 0x93,
10193
+-	0xd0, 0x93, 0x71, 0x21, 0x27, 0xc6, 0x1a, 0x38, 0xb0, 0xcf, 0x75, 0x98, 0x56, 0x26, 0xb9, 0x2d,
10194
+-	0xb7, 0xb1, 0xaf, 0xe5, 0x03, 0x56, 0xae, 0x87, 0xf5, 0x24, 0x02, 0xee, 0xae, 0x83, 0x16, 0x60,
10195
+-	0xd2, 0x28, 0xac, 0x56, 0x84, 0x30, 0xa3, 0x14, 0x73, 0x75, 0x13, 0x8c, 0x93, 0xf8, 0xf6, 0xcf,
10196
+-	0x58, 0xf0, 0x58, 0x46, 0xc2, 0x88, 0x81, 0xe3, 0xd6, 0x6c, 0xc2, 0x64, 0xdb, 0xac, 0xda, 0x27,
10197
+-	0xbc, 0x95, 0x91, 0x96, 0x42, 0xf5, 0x35, 0x01, 0xc0, 0x49, 0xa2, 0x8b, 0x57, 0x7f, 0xeb, 0xf7,
10198
+-	0x2f, 0x7d, 0xec, 0xb7, 0x7f, 0xff, 0xd2, 0xc7, 0x7e, 0xe7, 0xf7, 0x2f, 0x7d, 0xec, 0xcf, 0x1f,
10199
+-	0x5e, 0xb2, 0x7e, 0xeb, 0xf0, 0x92, 0xf5, 0xdb, 0x87, 0x97, 0xac, 0xdf, 0x39, 0xbc, 0x64, 0xfd,
10200
+-	0xde, 0xe1, 0x25, 0xeb, 0xab, 0x7f, 0x70, 0xe9, 0x63, 0x6f, 0xe7, 0xf6, 0x5e, 0xf8, 0xff, 0x01,
10201
+-	0x00, 0x00, 0xff, 0xff, 0x20, 0x56, 0xf9, 0x8e, 0x0d, 0xe7, 0x00, 0x00,
10202
++	// 12751 bytes of a gzipped FileDescriptorProto
10203
++	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x6c, 0x24, 0x57,
10204
++	0x76, 0x18, 0xbc, 0xd5, 0xdd, 0x7c, 0xf4, 0xe1, 0xfb, 0xce, 0x8b, 0x43, 0xcd, 0x4c, 0x8f, 0x4a,
10205
++	0xbb, 0xa3, 0xd1, 0x4a, 0x22, 0x57, 0x23, 0x69, 0x25, 0xaf, 0x76, 0x65, 0x93, 0x6c, 0x72, 0x86,
10206
++	0x9a, 0x21, 0xa7, 0x75, 0x9b, 0x33, 0xda, 0x95, 0xb5, 0xeb, 0x2d, 0x76, 0x5f, 0x92, 0x25, 0x16,
10207
++	0xab, 0x5a, 0x55, 0xd5, 0x9c, 0xa1, 0x3e, 0x1b, 0xf8, 0xb2, 0x8e, 0x9d, 0xf8, 0x81, 0x60, 0x11,
10208
++	0x1b, 0x79, 0xd8, 0x86, 0x03, 0x38, 0x0e, 0x6c, 0xc7, 0x49, 0x10, 0xc7, 0x8e, 0xed, 0xec, 0xda,
10209
++	0x89, 0xe3, 0x24, 0x80, 0xf3, 0x67, 0xe3, 0x04, 0x08, 0xd6, 0x80, 0x11, 0xc6, 0xa6, 0x8d, 0x04,
10210
++	0xfe, 0x91, 0x07, 0xe2, 0xfc, 0x31, 0x63, 0xc4, 0xc1, 0x7d, 0xd6, 0xbd, 0xd5, 0x55, 0xdd, 0xcd,
10211
++	0x11, 0x87, 0x92, 0x8d, 0xfd, 0xd7, 0x7d, 0xcf, 0xb9, 0xe7, 0xde, 0xba, 0xcf, 0x73, 0xce, 0x3d,
10212
++	0x0f, 0x78, 0x6d, 0xe7, 0xd5, 0x68, 0xd6, 0x0d, 0xe6, 0x76, 0xda, 0x1b, 0x24, 0xf4, 0x49, 0x4c,
10213
++	0xa2, 0xb9, 0x3d, 0xe2, 0x37, 0x83, 0x70, 0x4e, 0x00, 0x9c, 0x96, 0x3b, 0xd7, 0x08, 0x42, 0x32,
10214
++	0xb7, 0xf7, 0xc2, 0xdc, 0x16, 0xf1, 0x49, 0xe8, 0xc4, 0xa4, 0x39, 0xdb, 0x0a, 0x83, 0x38, 0x40,
10215
++	0x88, 0xe3, 0xcc, 0x3a, 0x2d, 0x77, 0x96, 0xe2, 0xcc, 0xee, 0xbd, 0x30, 0xf3, 0xfc, 0x96, 0x1b,
10216
++	0x6f, 0xb7, 0x37, 0x66, 0x1b, 0xc1, 0xee, 0xdc, 0x56, 0xb0, 0x15, 0xcc, 0x31, 0xd4, 0x8d, 0xf6,
10217
++	0x26, 0xfb, 0xc7, 0xfe, 0xb0, 0x5f, 0x9c, 0xc4, 0xcc, 0x6a, 0xd2, 0x0c, 0x79, 0x18, 0x13, 0x3f,
10218
++	0x72, 0x03, 0x3f, 0x7a, 0xde, 0x69, 0xb9, 0x11, 0x09, 0xf7, 0x48, 0x38, 0xd7, 0xda, 0xd9, 0xa2,
10219
++	0xb0, 0xc8, 0x44, 0x98, 0xdb, 0x7b, 0x61, 0x83, 0xc4, 0x4e, 0x47, 0x8f, 0x66, 0x5e, 0x4a, 0xc8,
10220
++	0xed, 0x3a, 0x8d, 0x6d, 0xd7, 0x27, 0xe1, 0xbe, 0xa4, 0x31, 0x17, 0x92, 0x28, 0x68, 0x87, 0x0d,
10221
++	0x72, 0xac, 0x5a, 0xd1, 0xdc, 0x2e, 0x89, 0x9d, 0x8c, 0xaf, 0x9f, 0x99, 0xcb, 0xab, 0x15, 0xb6,
10222
++	0xfd, 0xd8, 0xdd, 0xed, 0x6c, 0xe6, 0xd3, 0xbd, 0x2a, 0x44, 0x8d, 0x6d, 0xb2, 0xeb, 0x74, 0xd4,
10223
++	0x7b, 0x31, 0xaf, 0x5e, 0x3b, 0x76, 0xbd, 0x39, 0xd7, 0x8f, 0xa3, 0x38, 0x4c, 0x57, 0xb2, 0xbf,
10224
++	0x69, 0xc1, 0xd5, 0xf9, 0xb7, 0xea, 0x4b, 0x9e, 0x13, 0xc5, 0x6e, 0x63, 0xc1, 0x0b, 0x1a, 0x3b,
10225
++	0xf5, 0x38, 0x08, 0xc9, 0xfd, 0xc0, 0x6b, 0xef, 0x92, 0x3a, 0x1b, 0x08, 0xf4, 0x1c, 0x0c, 0xef,
10226
++	0xb1, 0xff, 0x2b, 0xd5, 0x69, 0xeb, 0xaa, 0x75, 0xbd, 0xbc, 0x30, 0xf9, 0x5b, 0x07, 0x95, 0x8f,
10227
++	0x1d, 0x1e, 0x54, 0x86, 0xef, 0x8b, 0x72, 0xac, 0x30, 0xd0, 0x35, 0x18, 0xdc, 0x8c, 0xd6, 0xf7,
10228
++	0x5b, 0x64, 0xba, 0xc0, 0x70, 0xc7, 0x05, 0xee, 0xe0, 0x72, 0x9d, 0x96, 0x62, 0x01, 0x45, 0x73,
10229
++	0x50, 0x6e, 0x39, 0x61, 0xec, 0xc6, 0x6e, 0xe0, 0x4f, 0x17, 0xaf, 0x5a, 0xd7, 0x07, 0x16, 0xa6,
10230
++	0x04, 0x6a, 0xb9, 0x26, 0x01, 0x38, 0xc1, 0xa1, 0xdd, 0x08, 0x89, 0xd3, 0xbc, 0xeb, 0x7b, 0xfb,
10231
++	0xd3, 0xa5, 0xab, 0xd6, 0xf5, 0xe1, 0xa4, 0x1b, 0x58, 0x94, 0x63, 0x85, 0x61, 0xff, 0x58, 0x01,
10232
++	0x86, 0xe7, 0x37, 0x37, 0x5d, 0xdf, 0x8d, 0xf7, 0xd1, 0x7d, 0x18, 0xf5, 0x83, 0x26, 0x91, 0xff,
10233
++	0xd9, 0x57, 0x8c, 0xdc, 0xb8, 0x3a, 0xdb, 0xb9, 0x32, 0x67, 0xd7, 0x34, 0xbc, 0x85, 0xc9, 0xc3,
10234
++	0x83, 0xca, 0xa8, 0x5e, 0x82, 0x0d, 0x3a, 0x08, 0xc3, 0x48, 0x2b, 0x68, 0x2a, 0xb2, 0x05, 0x46,
10235
++	0xb6, 0x92, 0x45, 0xb6, 0x96, 0xa0, 0x2d, 0x4c, 0x1c, 0x1e, 0x54, 0x46, 0xb4, 0x02, 0xac, 0x13,
10236
++	0x41, 0x1b, 0x30, 0x41, 0xff, 0xfa, 0xb1, 0xab, 0xe8, 0x16, 0x19, 0xdd, 0xa7, 0xf2, 0xe8, 0x6a,
10237
++	0xa8, 0x0b, 0x67, 0x0e, 0x0f, 0x2a, 0x13, 0xa9, 0x42, 0x9c, 0x26, 0x68, 0xbf, 0x0f, 0xe3, 0xf3,
10238
++	0x71, 0xec, 0x34, 0xb6, 0x49, 0x93, 0xcf, 0x20, 0x7a, 0x09, 0x4a, 0xbe, 0xb3, 0x4b, 0xc4, 0xfc,
10239
++	0x5e, 0x15, 0x03, 0x5b, 0x5a, 0x73, 0x76, 0xc9, 0xd1, 0x41, 0x65, 0xf2, 0x9e, 0xef, 0xbe, 0xd7,
10240
++	0x16, 0xab, 0x82, 0x96, 0x61, 0x86, 0x8d, 0x6e, 0x00, 0x34, 0xc9, 0x9e, 0xdb, 0x20, 0x35, 0x27,
10241
++	0xde, 0x16, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x87, 0x50, 0x9e, 0xdf,
10242
++	0x0b, 0xdc, 0x66, 0x2d, 0x68, 0x46, 0x68, 0x07, 0x26, 0x5a, 0x21, 0xd9, 0x24, 0xa1, 0x2a, 0x9a,
10243
++	0xb6, 0xae, 0x16, 0xaf, 0x8f, 0xdc, 0xb8, 0x9e, 0xf9, 0xb1, 0x26, 0xea, 0x92, 0x1f, 0x87, 0xfb,
10244
++	0x0b, 0x17, 0x44, 0x7b, 0x13, 0x29, 0x28, 0x4e, 0x53, 0xb6, 0xff, 0x75, 0x01, 0xce, 0xcd, 0xbf,
10245
++	0xdf, 0x0e, 0x49, 0xd5, 0x8d, 0x76, 0xd2, 0x2b, 0xbc, 0xe9, 0x46, 0x3b, 0x6b, 0xc9, 0x08, 0xa8,
10246
++	0xa5, 0x55, 0x15, 0xe5, 0x58, 0x61, 0xa0, 0xe7, 0x61, 0x88, 0xfe, 0xbe, 0x87, 0x57, 0xc4, 0x27,
10247
++	0x9f, 0x11, 0xc8, 0x23, 0x55, 0x27, 0x76, 0xaa, 0x1c, 0x84, 0x25, 0x0e, 0x5a, 0x85, 0x91, 0x06,
10248
++	0xdb, 0x90, 0x5b, 0xab, 0x41, 0x93, 0xb0, 0xc9, 0x2c, 0x2f, 0x3c, 0x4b, 0xd1, 0x17, 0x93, 0xe2,
10249
++	0xa3, 0x83, 0xca, 0x34, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, 0x7f, 0x95,
10250
++	0x18, 0x25, 0xc8, 0xd8, 0x5b, 0xd7, 0xb5, 0xad, 0x32, 0xc0, 0xb6, 0xca, 0x68, 0xf6, 0x36, 0x41,
10251
++	0x2f, 0x40, 0x69, 0xc7, 0xf5, 0x9b, 0xd3, 0x83, 0x8c, 0xd6, 0x65, 0x3a, 0xe7, 0xb7, 0x5d, 0xbf,
10252
++	0x79, 0x74, 0x50, 0x99, 0x32, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xd8, 0x82, 0x0a, 0x83,
10253
++	0x2d, 0xbb, 0x1e, 0xa9, 0x91, 0x30, 0x72, 0xa3, 0x98, 0xf8, 0xb1, 0x31, 0xa0, 0x37, 0x00, 0x22,
10254
++	0xd2, 0x08, 0x49, 0xac, 0x0d, 0xa9, 0x5a, 0x18, 0x75, 0x05, 0xc1, 0x1a, 0x16, 0x3d, 0x10, 0xa2,
10255
++	0x6d, 0x27, 0x64, 0xeb, 0x4b, 0x0c, 0xac, 0x3a, 0x10, 0xea, 0x12, 0x80, 0x13, 0x1c, 0xe3, 0x40,
10256
++	0x28, 0xf6, 0x3a, 0x10, 0xd0, 0xe7, 0x60, 0x22, 0x69, 0x2c, 0x6a, 0x39, 0x0d, 0x39, 0x80, 0x6c,
10257
++	0xcb, 0xd4, 0x4d, 0x10, 0x4e, 0xe3, 0xda, 0x7f, 0xdf, 0x12, 0x8b, 0x87, 0x7e, 0xf5, 0x47, 0xfc,
10258
++	0x5b, 0xed, 0x5f, 0xb5, 0x60, 0x68, 0xc1, 0xf5, 0x9b, 0xae, 0xbf, 0x85, 0xbe, 0x0c, 0xc3, 0xf4,
10259
++	0x6e, 0x6a, 0x3a, 0xb1, 0x23, 0xce, 0xbd, 0x4f, 0x69, 0x7b, 0x4b, 0x5d, 0x15, 0xb3, 0xad, 0x9d,
10260
++	0x2d, 0x5a, 0x10, 0xcd, 0x52, 0x6c, 0xba, 0xdb, 0xee, 0x6e, 0xbc, 0x4b, 0x1a, 0xf1, 0x2a, 0x89,
10261
++	0x9d, 0xe4, 0x73, 0x92, 0x32, 0xac, 0xa8, 0xa2, 0xdb, 0x30, 0x18, 0x3b, 0xe1, 0x16, 0x89, 0xc5,
10262
++	0x01, 0x98, 0x79, 0x50, 0xf1, 0x9a, 0x98, 0xee, 0x48, 0xe2, 0x37, 0x48, 0x72, 0x2d, 0xac, 0xb3,
10263
++	0xaa, 0x58, 0x90, 0xb0, 0x7f, 0x70, 0x10, 0x2e, 0x2e, 0xd6, 0x57, 0x72, 0xd6, 0xd5, 0x35, 0x18,
10264
++	0x6c, 0x86, 0xee, 0x1e, 0x09, 0xc5, 0x38, 0x2b, 0x2a, 0x55, 0x56, 0x8a, 0x05, 0x14, 0xbd, 0x0a,
10265
++	0xa3, 0xfc, 0x42, 0xba, 0xe5, 0xf8, 0x4d, 0x4f, 0x0e, 0xf1, 0x59, 0x81, 0x3d, 0x7a, 0x5f, 0x83,
10266
++	0x61, 0x03, 0xf3, 0x98, 0x8b, 0xea, 0x5a, 0x6a, 0x33, 0xe6, 0x5d, 0x76, 0x3f, 0x60, 0xc1, 0x24,
10267
++	0x6f, 0x66, 0x3e, 0x8e, 0x43, 0x77, 0xa3, 0x1d, 0x93, 0x68, 0x7a, 0x80, 0x9d, 0x74, 0x8b, 0x59,
10268
++	0xa3, 0x95, 0x3b, 0x02, 0xb3, 0xf7, 0x53, 0x54, 0xf8, 0x21, 0x38, 0x2d, 0xda, 0x9d, 0x4c, 0x83,
10269
++	0x71, 0x47, 0xb3, 0xe8, 0x7b, 0x2d, 0x98, 0x69, 0x04, 0x7e, 0x1c, 0x06, 0x9e, 0x47, 0xc2, 0x5a,
10270
++	0x7b, 0xc3, 0x73, 0xa3, 0x6d, 0xbe, 0x4e, 0x31, 0xd9, 0x64, 0x27, 0x41, 0xce, 0x1c, 0x2a, 0x24,
10271
++	0x31, 0x87, 0x57, 0x0e, 0x0f, 0x2a, 0x33, 0x8b, 0xb9, 0xa4, 0x70, 0x97, 0x66, 0xd0, 0x0e, 0x20,
10272
++	0x7a, 0x95, 0xd6, 0x63, 0x67, 0x8b, 0x24, 0x8d, 0x0f, 0xf5, 0xdf, 0xf8, 0xf9, 0xc3, 0x83, 0x0a,
10273
++	0x5a, 0xeb, 0x20, 0x81, 0x33, 0xc8, 0xa2, 0xf7, 0xe0, 0x2c, 0x2d, 0xed, 0xf8, 0xd6, 0xe1, 0xfe,
10274
++	0x9b, 0x9b, 0x3e, 0x3c, 0xa8, 0x9c, 0x5d, 0xcb, 0x20, 0x82, 0x33, 0x49, 0xcf, 0x2c, 0xc2, 0xb9,
10275
++	0xcc, 0xa9, 0x42, 0x93, 0x50, 0xdc, 0x21, 0x9c, 0x05, 0x29, 0x63, 0xfa, 0x13, 0x9d, 0x85, 0x81,
10276
++	0x3d, 0xc7, 0x6b, 0x8b, 0x55, 0x8a, 0xf9, 0x9f, 0xcf, 0x14, 0x5e, 0xb5, 0xec, 0x06, 0x8c, 0x2e,
10277
++	0x3a, 0x2d, 0x67, 0xc3, 0xf5, 0xdc, 0xd8, 0x25, 0x11, 0x7a, 0x1a, 0x8a, 0x4e, 0xb3, 0xc9, 0xae,
10278
++	0xc8, 0xf2, 0xc2, 0xb9, 0xc3, 0x83, 0x4a, 0x71, 0xbe, 0x49, 0xcf, 0x6a, 0x50, 0x58, 0xfb, 0x98,
10279
++	0x62, 0xa0, 0x4f, 0x42, 0xa9, 0x19, 0x06, 0xad, 0xe9, 0x02, 0xc3, 0xa4, 0x43, 0x55, 0xaa, 0x86,
10280
++	0x41, 0x2b, 0x85, 0xca, 0x70, 0x6c, 0x17, 0x2e, 0x2c, 0x3a, 0x51, 0xc3, 0x69, 0x76, 0xde, 0x8b,
10281
++	0x74, 0xbb, 0xb9, 0xd1, 0x8e, 0xe2, 0xfb, 0x92, 0xed, 0xc6, 0x4a, 0xb1, 0x80, 0xf6, 0xcb, 0xf3,
10282
++	0xd9, 0xbf, 0x51, 0x80, 0x4b, 0x8b, 0xa4, 0xb5, 0xbd, 0x5c, 0xcf, 0xd9, 0xdf, 0xd7, 0x61, 0x78,
10283
++	0x37, 0xf0, 0xdd, 0x38, 0x08, 0x23, 0xf1, 0x95, 0xec, 0xe2, 0x5a, 0x15, 0x65, 0x58, 0x41, 0xd1,
10284
++	0x55, 0x28, 0xb5, 0x12, 0xa6, 0x63, 0x54, 0x32, 0x2c, 0x8c, 0xdd, 0x60, 0x10, 0x8a, 0xd1, 0x8e,
10285
++	0x48, 0x28, 0x2e, 0x5c, 0x85, 0x71, 0x2f, 0x22, 0x21, 0x66, 0x90, 0xe4, 0xe4, 0xa6, 0x67, 0xba,
10286
++	0xd8, 0xc1, 0xa9, 0x93, 0x9b, 0x42, 0xb0, 0x86, 0x85, 0x6a, 0x50, 0x8e, 0xd4, 0xfa, 0x19, 0xe8,
10287
++	0x7f, 0xfd, 0x8c, 0xb1, 0xa3, 0x5d, 0x2d, 0x9a, 0x84, 0x88, 0x71, 0xe2, 0x0c, 0xf6, 0x3c, 0xda,
10288
++	0xbf, 0x5e, 0x00, 0xc4, 0x87, 0xf0, 0xcf, 0xd9, 0xc0, 0xdd, 0xeb, 0x1c, 0xb8, 0x4c, 0x26, 0xef,
10289
++	0x4e, 0xd0, 0x70, 0xbc, 0xf4, 0x6d, 0x71, 0x52, 0xa3, 0xf7, 0xbf, 0x2d, 0xb8, 0xb4, 0xe8, 0xfa,
10290
++	0x4d, 0x12, 0xe6, 0x2c, 0xc0, 0xc7, 0x23, 0xeb, 0x1c, 0xef, 0x52, 0x31, 0x96, 0x58, 0xe9, 0x04,
10291
++	0x96, 0x98, 0xfd, 0x3f, 0x2c, 0x40, 0xfc, 0xb3, 0x3f, 0x72, 0x1f, 0x7b, 0xaf, 0xf3, 0x63, 0x4f,
10292
++	0x60, 0x59, 0xd8, 0x77, 0x60, 0x7c, 0xd1, 0x73, 0x89, 0x1f, 0xaf, 0xd4, 0x16, 0x03, 0x7f, 0xd3,
10293
++	0xdd, 0x42, 0x9f, 0x81, 0x71, 0x2a, 0x3e, 0x07, 0xed, 0xb8, 0x4e, 0x1a, 0x81, 0xcf, 0x24, 0x0d,
10294
++	0x2a, 0x74, 0xa2, 0xc3, 0x83, 0xca, 0xf8, 0xba, 0x01, 0xc1, 0x29, 0x4c, 0xfb, 0x77, 0xe9, 0xf8,
10295
++	0x05, 0xbb, 0xad, 0xc0, 0x27, 0x7e, 0xbc, 0x18, 0xf8, 0x4d, 0x2e, 0x91, 0x7e, 0x06, 0x4a, 0x31,
10296
++	0x1d, 0x0f, 0x3e, 0x76, 0xd7, 0xe4, 0x46, 0xa1, 0xa3, 0x70, 0x74, 0x50, 0x39, 0xdf, 0x59, 0x83,
10297
++	0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x06, 0xa3, 0xd8, 0x89, 0xdb, 0x91, 0x18, 0xcd, 0x27, 0xe5,
10298
++	0x68, 0xd6, 0x59, 0xe9, 0xd1, 0x41, 0x65, 0x42, 0x55, 0xe3, 0x45, 0x58, 0x54, 0x40, 0xcf, 0xc0,
10299
++	0xd0, 0x2e, 0x89, 0x22, 0x67, 0x4b, 0x0a, 0x13, 0x13, 0xa2, 0xee, 0xd0, 0x2a, 0x2f, 0xc6, 0x12,
10300
++	0x8e, 0x9e, 0x82, 0x01, 0x12, 0x86, 0x41, 0x28, 0xf6, 0xe8, 0x98, 0x40, 0x1c, 0x58, 0xa2, 0x85,
10301
++	0x98, 0xc3, 0xec, 0x7f, 0x67, 0xc1, 0x84, 0xea, 0x2b, 0x6f, 0xeb, 0x14, 0xb8, 0xc6, 0xb7, 0x01,
10302
++	0x1a, 0xf2, 0x03, 0x23, 0x76, 0x51, 0x8d, 0xdc, 0xb8, 0x96, 0xc9, 0x0b, 0x75, 0x0c, 0x63, 0x42,
10303
++	0x59, 0x15, 0x45, 0x58, 0xa3, 0x66, 0xff, 0xba, 0x05, 0x67, 0x52, 0x5f, 0x74, 0xc7, 0x8d, 0x62,
10304
++	0xf4, 0x4e, 0xc7, 0x57, 0xcd, 0xf6, 0xf7, 0x55, 0xb4, 0x36, 0xfb, 0x26, 0xb5, 0x94, 0x65, 0x89,
10305
++	0xf6, 0x45, 0xb7, 0x60, 0xc0, 0x8d, 0xc9, 0xae, 0xfc, 0x98, 0xa7, 0xba, 0x7e, 0x0c, 0xef, 0x55,
10306
++	0x32, 0x23, 0x2b, 0xb4, 0x26, 0xe6, 0x04, 0xec, 0x1f, 0x29, 0x42, 0x99, 0x2f, 0xdb, 0x55, 0xa7,
10307
++	0x75, 0x0a, 0x73, 0xb1, 0x02, 0x25, 0x46, 0x9d, 0x77, 0xfc, 0xe9, 0xec, 0x8e, 0x8b, 0xee, 0xcc,
10308
++	0x52, 0x91, 0x90, 0x73, 0x9d, 0xea, 0x6a, 0xa0, 0x45, 0x98, 0x91, 0x40, 0x0e, 0xc0, 0x86, 0xeb,
10309
++	0x3b, 0xe1, 0x3e, 0x2d, 0x9b, 0x2e, 0x32, 0x82, 0xcf, 0x77, 0x27, 0xb8, 0xa0, 0xf0, 0x39, 0x59,
10310
++	0xd5, 0xd7, 0x04, 0x80, 0x35, 0xa2, 0x33, 0xaf, 0x40, 0x59, 0x21, 0x1f, 0x87, 0x9d, 0x9a, 0xf9,
10311
++	0x1c, 0x4c, 0xa4, 0xda, 0xea, 0x55, 0x7d, 0x54, 0xe7, 0xc6, 0xbe, 0xc6, 0x4e, 0x01, 0xd1, 0xeb,
10312
++	0x25, 0x7f, 0x4f, 0x9c, 0xa2, 0xef, 0xc3, 0x59, 0x2f, 0xe3, 0x70, 0x12, 0x53, 0xd5, 0xff, 0x61,
10313
++	0x76, 0x49, 0x7c, 0xf6, 0xd9, 0x2c, 0x28, 0xce, 0x6c, 0x83, 0x5e, 0xfb, 0x41, 0x8b, 0xae, 0x79,
10314
++	0xc7, 0x63, 0xfd, 0x15, 0x82, 0xfe, 0x5d, 0x51, 0x86, 0x15, 0x94, 0x1e, 0x61, 0x67, 0x55, 0xe7,
10315
++	0x6f, 0x93, 0xfd, 0x3a, 0xf1, 0x48, 0x23, 0x0e, 0xc2, 0x0f, 0xb5, 0xfb, 0x97, 0xf9, 0xe8, 0xf3,
10316
++	0x13, 0x70, 0x44, 0x10, 0x28, 0xde, 0x26, 0xfb, 0x7c, 0x2a, 0xf4, 0xaf, 0x2b, 0x76, 0xfd, 0xba,
10317
++	0x5f, 0xb0, 0x60, 0x4c, 0x7d, 0xdd, 0x29, 0x6c, 0xf5, 0x05, 0x73, 0xab, 0x5f, 0xee, 0xba, 0xc0,
10318
++	0x73, 0x36, 0xf9, 0xd7, 0x0b, 0x70, 0x51, 0xe1, 0x50, 0xc9, 0x82, 0xff, 0x11, 0xab, 0x6a, 0x0e,
10319
++	0xca, 0xbe, 0x52, 0x54, 0x58, 0xa6, 0x86, 0x20, 0x51, 0x53, 0x24, 0x38, 0x94, 0x6b, 0xf3, 0x13,
10320
++	0x6d, 0xc2, 0xa8, 0xae, 0xc1, 0x13, 0xda, 0xba, 0x05, 0x28, 0xb6, 0xdd, 0xa6, 0xb8, 0x33, 0x3e,
10321
++	0x25, 0x47, 0xfb, 0xde, 0x4a, 0xf5, 0xe8, 0xa0, 0xf2, 0x64, 0x9e, 0xf6, 0x98, 0x5e, 0x56, 0xd1,
10322
++	0xec, 0xbd, 0x95, 0x2a, 0xa6, 0x95, 0xd1, 0x3c, 0x4c, 0x48, 0x05, 0xf9, 0x7d, 0xca, 0x41, 0x05,
10323
++	0xbe, 0xb8, 0x5a, 0x94, 0x1a, 0x0e, 0x9b, 0x60, 0x9c, 0xc6, 0x47, 0x55, 0x98, 0xdc, 0x69, 0x6f,
10324
++	0x10, 0x8f, 0xc4, 0xfc, 0x83, 0x6f, 0x13, 0xae, 0xa4, 0x2a, 0x27, 0x52, 0xec, 0xed, 0x14, 0x1c,
10325
++	0x77, 0xd4, 0xb0, 0xff, 0x8c, 0x1d, 0xf1, 0x62, 0xf4, 0x6a, 0x61, 0x40, 0x17, 0x16, 0xa5, 0xfe,
10326
++	0x61, 0x2e, 0xe7, 0x7e, 0x56, 0xc5, 0x6d, 0xb2, 0xbf, 0x1e, 0x50, 0x66, 0x3b, 0x7b, 0x55, 0x18,
10327
++	0x6b, 0xbe, 0xd4, 0x75, 0xcd, 0xff, 0x52, 0x01, 0xce, 0xa9, 0x11, 0x30, 0xf8, 0xba, 0x3f, 0xef,
10328
++	0x63, 0xf0, 0x02, 0x8c, 0x34, 0xc9, 0xa6, 0xd3, 0xf6, 0x62, 0xa5, 0x31, 0x1d, 0xe0, 0x5a, 0xf3,
10329
++	0x6a, 0x52, 0x8c, 0x75, 0x9c, 0x63, 0x0c, 0xdb, 0x4f, 0x8f, 0xb0, 0xbb, 0x35, 0x76, 0xe8, 0x1a,
10330
++	0x57, 0xbb, 0xc6, 0xca, 0xdd, 0x35, 0x4f, 0xc1, 0x80, 0xbb, 0x4b, 0x79, 0xad, 0x82, 0xc9, 0x42,
10331
++	0xad, 0xd0, 0x42, 0xcc, 0x61, 0xe8, 0x13, 0x30, 0xd4, 0x08, 0x76, 0x77, 0x1d, 0xbf, 0xc9, 0xae,
10332
++	0xbc, 0xf2, 0xc2, 0x08, 0x65, 0xc7, 0x16, 0x79, 0x11, 0x96, 0x30, 0x74, 0x09, 0x4a, 0x4e, 0xb8,
10333
++	0x15, 0x4d, 0x97, 0x18, 0xce, 0x30, 0x6d, 0x69, 0x3e, 0xdc, 0x8a, 0x30, 0x2b, 0xa5, 0x52, 0xd5,
10334
++	0x83, 0x20, 0xdc, 0x71, 0xfd, 0xad, 0xaa, 0x1b, 0x8a, 0x2d, 0xa1, 0xee, 0xc2, 0xb7, 0x14, 0x04,
10335
++	0x6b, 0x58, 0x68, 0x19, 0x06, 0x5a, 0x41, 0x18, 0x47, 0xd3, 0x83, 0x6c, 0xb8, 0x9f, 0xcc, 0x39,
10336
++	0x88, 0xf8, 0xd7, 0xd6, 0x82, 0x30, 0x4e, 0x3e, 0x80, 0xfe, 0x8b, 0x30, 0xaf, 0x8e, 0xbe, 0x0d,
10337
++	0x8a, 0xc4, 0xdf, 0x9b, 0x1e, 0x62, 0x54, 0x66, 0xb2, 0xa8, 0x2c, 0xf9, 0x7b, 0xf7, 0x9d, 0x30,
10338
++	0x39, 0xa5, 0x97, 0xfc, 0x3d, 0x4c, 0xeb, 0xa0, 0x2f, 0x40, 0x59, 0x6e, 0xf1, 0x48, 0x68, 0x54,
10339
++	0x32, 0x97, 0x98, 0x3c, 0x18, 0x30, 0x79, 0xaf, 0xed, 0x86, 0x64, 0x97, 0xf8, 0x71, 0x94, 0x9c,
10340
++	0x69, 0x12, 0x1a, 0xe1, 0x84, 0x1a, 0xfa, 0x82, 0x54, 0xe3, 0xad, 0x06, 0x6d, 0x3f, 0x8e, 0xa6,
10341
++	0xcb, 0xac, 0x7b, 0x99, 0x0f, 0x2c, 0xf7, 0x13, 0xbc, 0xb4, 0x9e, 0x8f, 0x57, 0xc6, 0x06, 0x29,
10342
++	0x84, 0x61, 0xcc, 0x73, 0xf7, 0x88, 0x4f, 0xa2, 0xa8, 0x16, 0x06, 0x1b, 0x64, 0x1a, 0x58, 0xcf,
10343
++	0x2f, 0x66, 0xbf, 0x3b, 0x04, 0x1b, 0x64, 0x61, 0xea, 0xf0, 0xa0, 0x32, 0x76, 0x47, 0xaf, 0x83,
10344
++	0x4d, 0x12, 0xe8, 0x1e, 0x8c, 0x53, 0xb9, 0xc6, 0x4d, 0x88, 0x8e, 0xf4, 0x22, 0xca, 0xa4, 0x0f,
10345
++	0x6c, 0x54, 0xc2, 0x29, 0x22, 0xe8, 0x0d, 0x28, 0x7b, 0xee, 0x26, 0x69, 0xec, 0x37, 0x3c, 0x32,
10346
++	0x3d, 0xca, 0x28, 0x66, 0x6e, 0xab, 0x3b, 0x12, 0x89, 0xcb, 0x45, 0xea, 0x2f, 0x4e, 0xaa, 0xa3,
10347
++	0xfb, 0x70, 0x3e, 0x26, 0xe1, 0xae, 0xeb, 0x3b, 0x74, 0x3b, 0x08, 0x79, 0x81, 0xbd, 0xde, 0x8c,
10348
++	0xb1, 0xf5, 0x76, 0x45, 0x0c, 0xdd, 0xf9, 0xf5, 0x4c, 0x2c, 0x9c, 0x53, 0x1b, 0xdd, 0x85, 0x09,
10349
++	0xb6, 0x13, 0x6a, 0x6d, 0xcf, 0xab, 0x05, 0x9e, 0xdb, 0xd8, 0x9f, 0x1e, 0x67, 0x04, 0x3f, 0x21,
10350
++	0xef, 0x85, 0x15, 0x13, 0x7c, 0x74, 0x50, 0x81, 0xe4, 0x1f, 0x4e, 0xd7, 0x46, 0x1b, 0x4c, 0x5d,
10351
++	0xdf, 0x0e, 0xdd, 0x78, 0x9f, 0xae, 0x5f, 0xf2, 0x30, 0x9e, 0x9e, 0xe8, 0x2a, 0x0a, 0xeb, 0xa8,
10352
++	0x4a, 0xa7, 0xaf, 0x17, 0xe2, 0x34, 0x41, 0xba, 0xb5, 0xa3, 0xb8, 0xe9, 0xfa, 0xd3, 0x93, 0xec,
10353
++	0xc4, 0x50, 0x3b, 0xa3, 0x4e, 0x0b, 0x31, 0x87, 0x31, 0x55, 0x3d, 0xfd, 0x71, 0x97, 0x9e, 0xa0,
10354
++	0x53, 0x0c, 0x31, 0x51, 0xd5, 0x4b, 0x00, 0x4e, 0x70, 0x28, 0x53, 0x13, 0xc7, 0xfb, 0xd3, 0x88,
10355
++	0xa1, 0xaa, 0xed, 0xb2, 0xbe, 0xfe, 0x05, 0x4c, 0xcb, 0xd1, 0x1d, 0x18, 0x22, 0xfe, 0xde, 0x72,
10356
++	0x18, 0xec, 0x4e, 0x9f, 0xc9, 0xdf, 0xb3, 0x4b, 0x1c, 0x85, 0x1f, 0xe8, 0x89, 0x80, 0x27, 0x8a,
10357
++	0xb1, 0x24, 0x81, 0x1e, 0xc2, 0x74, 0xc6, 0x8c, 0xf0, 0x09, 0x38, 0xcb, 0x26, 0xe0, 0xb3, 0xa2,
10358
++	0xee, 0xf4, 0x7a, 0x0e, 0xde, 0x51, 0x17, 0x18, 0xce, 0xa5, 0x8e, 0xbe, 0x08, 0x63, 0x7c, 0x43,
10359
++	0xf1, 0x77, 0xbe, 0x68, 0xfa, 0x1c, 0xfb, 0x9a, 0xab, 0xf9, 0x9b, 0x93, 0x23, 0x2e, 0x9c, 0x13,
10360
++	0x1d, 0x1a, 0xd3, 0x4b, 0x23, 0x6c, 0x52, 0xb3, 0x37, 0x60, 0x5c, 0x9d, 0x5b, 0x6c, 0xe9, 0xa0,
10361
++	0x0a, 0x0c, 0x30, 0x6e, 0x47, 0xe8, 0xb7, 0xca, 0x74, 0xa6, 0x18, 0x27, 0x84, 0x79, 0x39, 0x9b,
10362
++	0x29, 0xf7, 0x7d, 0xb2, 0xb0, 0x1f, 0x13, 0x2e, 0x55, 0x17, 0xb5, 0x99, 0x92, 0x00, 0x9c, 0xe0,
10363
++	0xd8, 0xff, 0x97, 0x73, 0x8d, 0xc9, 0xe1, 0xd8, 0xc7, 0x75, 0xf0, 0x1c, 0x0c, 0x6f, 0x07, 0x51,
10364
++	0x4c, 0xb1, 0x59, 0x1b, 0x03, 0x09, 0x9f, 0x78, 0x4b, 0x94, 0x63, 0x85, 0x81, 0x5e, 0x83, 0xb1,
10365
++	0x86, 0xde, 0x80, 0xb8, 0xcb, 0xd4, 0x10, 0x18, 0xad, 0x63, 0x13, 0x17, 0xbd, 0x0a, 0xc3, 0xec,
10366
++	0x95, 0xbe, 0x11, 0x78, 0x82, 0xc9, 0x92, 0x17, 0xf2, 0x70, 0x4d, 0x94, 0x1f, 0x69, 0xbf, 0xb1,
10367
++	0xc2, 0x46, 0xd7, 0x60, 0x90, 0x76, 0x61, 0xa5, 0x26, 0x6e, 0x11, 0xa5, 0xaa, 0xb9, 0xc5, 0x4a,
10368
++	0xb1, 0x80, 0xda, 0x7f, 0xbd, 0xa0, 0x8d, 0x32, 0x95, 0x48, 0x09, 0xaa, 0xc1, 0xd0, 0x03, 0xc7,
10369
++	0x8d, 0x5d, 0x7f, 0x4b, 0xb0, 0x0b, 0xcf, 0x74, 0xbd, 0x52, 0x58, 0xa5, 0xb7, 0x78, 0x05, 0x7e,
10370
++	0xe9, 0x89, 0x3f, 0x58, 0x92, 0xa1, 0x14, 0xc3, 0xb6, 0xef, 0x53, 0x8a, 0x85, 0x7e, 0x29, 0x62,
10371
++	0x5e, 0x81, 0x53, 0x14, 0x7f, 0xb0, 0x24, 0x83, 0xde, 0x01, 0x90, 0xcb, 0x92, 0x34, 0xc5, 0xeb,
10372
++	0xf8, 0x73, 0xbd, 0x89, 0xae, 0xab, 0x3a, 0x0b, 0xe3, 0xf4, 0x4a, 0x4d, 0xfe, 0x63, 0x8d, 0x9e,
10373
++	0x1d, 0x33, 0xb6, 0xaa, 0xb3, 0x33, 0xe8, 0x3b, 0xe9, 0x49, 0xe0, 0x84, 0x31, 0x69, 0xce, 0xc7,
10374
++	0x62, 0x70, 0x3e, 0xd9, 0x9f, 0x4c, 0xb1, 0xee, 0xee, 0x12, 0xfd, 0xd4, 0x10, 0x44, 0x70, 0x42,
10375
++	0xcf, 0xfe, 0x95, 0x22, 0x4c, 0xe7, 0x75, 0x97, 0x2e, 0x3a, 0xf2, 0xd0, 0x8d, 0x17, 0x29, 0x37,
10376
++	0x64, 0x99, 0x8b, 0x6e, 0x49, 0x94, 0x63, 0x85, 0x41, 0x67, 0x3f, 0x72, 0xb7, 0xa4, 0x48, 0x38,
10377
++	0x90, 0xcc, 0x7e, 0x9d, 0x95, 0x62, 0x01, 0xa5, 0x78, 0x21, 0x71, 0x22, 0x61, 0x7e, 0xa1, 0xad,
10378
++	0x12, 0xcc, 0x4a, 0xb1, 0x80, 0xea, 0xfa, 0xa6, 0x52, 0x0f, 0x7d, 0x93, 0x31, 0x44, 0x03, 0x27,
10379
++	0x3b, 0x44, 0xe8, 0x4b, 0x00, 0x9b, 0xae, 0xef, 0x46, 0xdb, 0x8c, 0xfa, 0xe0, 0xb1, 0xa9, 0x2b,
10380
++	0x5e, 0x6a, 0x59, 0x51, 0xc1, 0x1a, 0x45, 0xf4, 0x32, 0x8c, 0xa8, 0x0d, 0xb8, 0x52, 0x65, 0x6f,
10381
++	0x51, 0xda, 0xdb, 0x7e, 0x72, 0x1a, 0x55, 0xb1, 0x8e, 0x67, 0xbf, 0x9b, 0x5e, 0x2f, 0x62, 0x07,
10382
++	0x68, 0xe3, 0x6b, 0xf5, 0x3b, 0xbe, 0x85, 0xee, 0xe3, 0x6b, 0xff, 0x66, 0x11, 0x26, 0x8c, 0xc6,
10383
++	0xda, 0x51, 0x1f, 0x67, 0xd6, 0x4d, 0x7a, 0xcf, 0x39, 0x31, 0x11, 0xfb, 0xcf, 0xee, 0xbd, 0x55,
10384
++	0xf4, 0xbb, 0x90, 0xee, 0x00, 0x5e, 0x1f, 0x7d, 0x09, 0xca, 0x9e, 0x13, 0x31, 0xdd, 0x15, 0x11,
10385
++	0xfb, 0xae, 0x1f, 0x62, 0x89, 0x1c, 0xe1, 0x44, 0xb1, 0x76, 0xd5, 0x70, 0xda, 0x09, 0x49, 0x7a,
10386
++	0x21, 0x53, 0xde, 0x47, 0xda, 0xf7, 0xa8, 0x4e, 0x50, 0x06, 0x69, 0x1f, 0x73, 0x18, 0x7a, 0x15,
10387
++	0x46, 0x43, 0xc2, 0x56, 0xc5, 0x22, 0x65, 0xe5, 0xd8, 0x32, 0x1b, 0x48, 0x78, 0x3e, 0xac, 0xc1,
10388
++	0xb0, 0x81, 0x99, 0xb0, 0xf2, 0x83, 0x5d, 0x58, 0xf9, 0x67, 0x60, 0x88, 0xfd, 0x50, 0x2b, 0x40,
10389
++	0xcd, 0xc6, 0x0a, 0x2f, 0xc6, 0x12, 0x9e, 0x5e, 0x30, 0xc3, 0x7d, 0x2e, 0x98, 0x4f, 0xc2, 0x78,
10390
++	0xd5, 0x21, 0xbb, 0x81, 0xbf, 0xe4, 0x37, 0x5b, 0x81, 0xeb, 0xc7, 0x68, 0x1a, 0x4a, 0xec, 0x76,
10391
++	0xe0, 0x7b, 0xbb, 0x44, 0x29, 0xe0, 0x12, 0x65, 0xcc, 0xed, 0x2d, 0x38, 0x57, 0x0d, 0x1e, 0xf8,
10392
++	0x0f, 0x9c, 0xb0, 0x39, 0x5f, 0x5b, 0xd1, 0xe4, 0xdc, 0x35, 0x29, 0x67, 0x71, 0x7b, 0x99, 0xcc,
10393
++	0x33, 0x55, 0xab, 0xc9, 0xef, 0xda, 0x65, 0xd7, 0x23, 0x39, 0xda, 0x88, 0xbf, 0x59, 0x30, 0x5a,
10394
++	0x4a, 0xf0, 0xd5, 0x83, 0x91, 0x95, 0xfb, 0x60, 0xf4, 0x26, 0x0c, 0x6f, 0xba, 0xc4, 0x6b, 0x62,
10395
++	0xb2, 0x29, 0x96, 0xd8, 0xd3, 0xf9, 0x26, 0x00, 0xcb, 0x14, 0x53, 0x6a, 0x9f, 0xb8, 0x94, 0xb6,
10396
++	0x2c, 0x2a, 0x63, 0x45, 0x06, 0xed, 0xc0, 0xa4, 0x14, 0x03, 0x24, 0x54, 0x2c, 0xb8, 0x67, 0xba,
10397
++	0xc9, 0x16, 0x26, 0xf1, 0xb3, 0x87, 0x07, 0x95, 0x49, 0x9c, 0x22, 0x83, 0x3b, 0x08, 0x53, 0xb1,
10398
++	0x6c, 0x97, 0x1e, 0xad, 0x25, 0x36, 0xfc, 0x4c, 0x2c, 0x63, 0x12, 0x26, 0x2b, 0xb5, 0x7f, 0xc2,
10399
++	0x82, 0x0b, 0x1d, 0x23, 0x23, 0x24, 0xed, 0x13, 0x9e, 0x85, 0xb4, 0xe4, 0x5b, 0xe8, 0x2d, 0xf9,
10400
++	0xda, 0xff, 0xc0, 0x82, 0xb3, 0x4b, 0xbb, 0xad, 0x78, 0xbf, 0xea, 0x9a, 0xaf, 0x3b, 0xaf, 0xc0,
10401
++	0xe0, 0x2e, 0x69, 0xba, 0xed, 0x5d, 0x31, 0x73, 0x15, 0x79, 0xfc, 0xac, 0xb2, 0xd2, 0xa3, 0x83,
10402
++	0xca, 0x58, 0x3d, 0x0e, 0x42, 0x67, 0x8b, 0xf0, 0x02, 0x2c, 0xd0, 0xd9, 0x21, 0xee, 0xbe, 0x4f,
10403
++	0xee, 0xb8, 0xbb, 0xae, 0x34, 0xe9, 0xe8, 0xaa, 0x3b, 0x9b, 0x95, 0x03, 0x3a, 0xfb, 0x66, 0xdb,
10404
++	0xf1, 0x63, 0x37, 0xde, 0x17, 0x0f, 0x33, 0x92, 0x08, 0x4e, 0xe8, 0xd9, 0xdf, 0xb4, 0x60, 0x42,
10405
++	0xae, 0xfb, 0xf9, 0x66, 0x33, 0x24, 0x51, 0x84, 0x66, 0xa0, 0xe0, 0xb6, 0x44, 0x2f, 0x41, 0xf4,
10406
++	0xb2, 0xb0, 0x52, 0xc3, 0x05, 0xb7, 0x85, 0x6a, 0x50, 0xe6, 0x96, 0x21, 0xc9, 0xe2, 0xea, 0xcb,
10407
++	0xbe, 0x84, 0xf5, 0x60, 0x5d, 0xd6, 0xc4, 0x09, 0x11, 0xc9, 0xc1, 0xb1, 0x33, 0xb3, 0x68, 0xbe,
10408
++	0x7a, 0xdd, 0x12, 0xe5, 0x58, 0x61, 0xa0, 0xeb, 0x30, 0xec, 0x07, 0x4d, 0x6e, 0xa8, 0xc3, 0x6f,
10409
++	0x3f, 0xb6, 0x64, 0xd7, 0x44, 0x19, 0x56, 0x50, 0xfb, 0x87, 0x2d, 0x18, 0x95, 0x5f, 0xd6, 0x27,
10410
++	0x33, 0x49, 0xb7, 0x56, 0xc2, 0x48, 0x26, 0x5b, 0x8b, 0x32, 0x83, 0x0c, 0x62, 0xf0, 0x80, 0xc5,
10411
++	0xe3, 0xf0, 0x80, 0xf6, 0x8f, 0x17, 0x60, 0x5c, 0x76, 0xa7, 0xde, 0xde, 0x88, 0x48, 0x8c, 0xd6,
10412
++	0xa1, 0xec, 0xf0, 0x21, 0x27, 0x72, 0xc5, 0x3e, 0x95, 0x2d, 0x7c, 0x18, 0xf3, 0x93, 0x5c, 0xcb,
10413
++	0xf3, 0xb2, 0x36, 0x4e, 0x08, 0x21, 0x0f, 0xa6, 0xfc, 0x20, 0x66, 0x47, 0xb4, 0x82, 0x77, 0x7b,
10414
++	0x02, 0x49, 0x53, 0xbf, 0x28, 0xa8, 0x4f, 0xad, 0xa5, 0xa9, 0xe0, 0x4e, 0xc2, 0x68, 0x49, 0x2a,
10415
++	0x3c, 0x8a, 0xf9, 0xe2, 0x86, 0x3e, 0x0b, 0xd9, 0xfa, 0x0e, 0xfb, 0xd7, 0x2c, 0x28, 0x4b, 0xb4,
10416
++	0xd3, 0x78, 0xed, 0x5a, 0x85, 0xa1, 0x88, 0x4d, 0x82, 0x1c, 0x1a, 0xbb, 0x5b, 0xc7, 0xf9, 0x7c,
10417
++	0x25, 0x37, 0x0f, 0xff, 0x1f, 0x61, 0x49, 0x83, 0xe9, 0xbb, 0x55, 0xf7, 0x3f, 0x22, 0xfa, 0x6e,
10418
++	0xd5, 0x9f, 0x9c, 0x1b, 0xe6, 0xbf, 0xb2, 0x3e, 0x6b, 0x62, 0x2d, 0x65, 0x90, 0x5a, 0x21, 0xd9,
10419
++	0x74, 0x1f, 0xa6, 0x19, 0xa4, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x81, 0xd1, 0x86, 0x54, 0x74,
10420
++	0x26, 0xc7, 0xc0, 0xb5, 0xae, 0x4a, 0x77, 0xf5, 0x3e, 0xc3, 0x8d, 0x78, 0x17, 0xb5, 0xfa, 0xd8,
10421
++	0xa0, 0x66, 0x3e, 0xb7, 0x17, 0x7b, 0x3d, 0xb7, 0x27, 0x74, 0xf3, 0x1f, 0x9f, 0x7f, 0xd2, 0x82,
10422
++	0x41, 0xae, 0x2e, 0xeb, 0x4f, 0xbf, 0xa8, 0x3d, 0x57, 0x25, 0x63, 0x77, 0x9f, 0x16, 0x8a, 0xe7,
10423
++	0x27, 0xb4, 0x0a, 0x65, 0xf6, 0x83, 0xa9, 0x0d, 0x8a, 0xf9, 0xd6, 0xcb, 0xbc, 0x55, 0xbd, 0x83,
10424
++	0xf7, 0x65, 0x35, 0x9c, 0x50, 0xb0, 0x7f, 0xb4, 0x48, 0x8f, 0xaa, 0x04, 0xd5, 0xb8, 0xc1, 0xad,
10425
++	0xc7, 0x77, 0x83, 0x17, 0x1e, 0xd7, 0x0d, 0xbe, 0x05, 0x13, 0x0d, 0xed, 0x71, 0x2b, 0x99, 0xc9,
10426
++	0xeb, 0x5d, 0x17, 0x89, 0xf6, 0x0e, 0xc6, 0x55, 0x46, 0x8b, 0x26, 0x11, 0x9c, 0xa6, 0x8a, 0xbe,
10427
++	0x13, 0x46, 0xf9, 0x3c, 0x8b, 0x56, 0xb8, 0xc5, 0xc2, 0x27, 0xf2, 0xd7, 0x8b, 0xde, 0x04, 0x5b,
10428
++	0x89, 0x75, 0xad, 0x3a, 0x36, 0x88, 0xd9, 0xbf, 0x32, 0x0c, 0x03, 0x4b, 0x7b, 0xc4, 0x8f, 0x4f,
10429
++	0xe1, 0x40, 0x6a, 0xc0, 0xb8, 0xeb, 0xef, 0x05, 0xde, 0x1e, 0x69, 0x72, 0xf8, 0x71, 0x2e, 0xd7,
10430
++	0xf3, 0x82, 0xf4, 0xf8, 0x8a, 0x41, 0x02, 0xa7, 0x48, 0x3e, 0x0e, 0x09, 0xf3, 0x26, 0x0c, 0xf2,
10431
++	0xb9, 0x17, 0xe2, 0x65, 0xa6, 0x32, 0x98, 0x0d, 0xa2, 0xd8, 0x05, 0x89, 0xf4, 0xcb, 0xb5, 0xcf,
10432
++	0xa2, 0x3a, 0x7a, 0x17, 0xc6, 0x37, 0xdd, 0x30, 0x8a, 0xa9, 0x68, 0x18, 0xc5, 0xce, 0x6e, 0xeb,
10433
++	0x11, 0x24, 0x4a, 0x35, 0x0e, 0xcb, 0x06, 0x25, 0x9c, 0xa2, 0x8c, 0xb6, 0x60, 0x8c, 0x0a, 0x39,
10434
++	0x49, 0x53, 0x43, 0xc7, 0x6e, 0x4a, 0xa9, 0x8c, 0xee, 0xe8, 0x84, 0xb0, 0x49, 0x97, 0x1e, 0x26,
10435
++	0x0d, 0x26, 0x14, 0x0d, 0x33, 0x8e, 0x42, 0x1d, 0x26, 0x5c, 0x1a, 0xe2, 0x30, 0x7a, 0x26, 0x31,
10436
++	0xb3, 0x95, 0xb2, 0x79, 0x26, 0x69, 0xc6, 0x29, 0x5f, 0x86, 0x32, 0xa1, 0x43, 0x48, 0x09, 0x0b,
10437
++	0xc5, 0xf8, 0x5c, 0x7f, 0x7d, 0x5d, 0x75, 0x1b, 0x61, 0x60, 0xca, 0xf2, 0x4b, 0x92, 0x12, 0x4e,
10438
++	0x88, 0xa2, 0x45, 0x18, 0x8c, 0x48, 0xe8, 0x92, 0x48, 0xa8, 0xc8, 0xbb, 0x4c, 0x23, 0x43, 0xe3,
10439
++	0x66, 0xee, 0xfc, 0x37, 0x16, 0x55, 0xe9, 0xf2, 0x72, 0x98, 0x34, 0xc4, 0xb4, 0xe2, 0xda, 0xf2,
10440
++	0x9a, 0x67, 0xa5, 0x58, 0x40, 0xd1, 0x1b, 0x30, 0x14, 0x12, 0x8f, 0x29, 0x8b, 0xc6, 0xfa, 0x5f,
10441
++	0xe4, 0x5c, 0xf7, 0xc4, 0xeb, 0x61, 0x49, 0x00, 0xdd, 0x06, 0x14, 0x12, 0xca, 0x43, 0xb8, 0xfe,
10442
++	0x96, 0x32, 0xe6, 0x10, 0xba, 0xee, 0x27, 0x44, 0xfb, 0x67, 0x70, 0x82, 0x21, 0x0d, 0x60, 0x71,
10443
++	0x46, 0x35, 0x74, 0x13, 0xa6, 0x54, 0xe9, 0x8a, 0x1f, 0xc5, 0x8e, 0xdf, 0x20, 0x4c, 0xcd, 0x5d,
10444
++	0x4e, 0xb8, 0x22, 0x9c, 0x46, 0xc0, 0x9d, 0x75, 0xec, 0x9f, 0xa3, 0xec, 0x0c, 0x1d, 0xad, 0x53,
10445
++	0xe0, 0x05, 0x5e, 0x37, 0x79, 0x81, 0x8b, 0xb9, 0x33, 0x97, 0xc3, 0x07, 0x1c, 0x5a, 0x30, 0xa2,
10446
++	0xcd, 0x6c, 0xb2, 0x66, 0xad, 0x2e, 0x6b, 0xb6, 0x0d, 0x93, 0x74, 0xa5, 0xdf, 0xdd, 0x60, 0x1e,
10447
++	0x5f, 0x4d, 0xb6, 0x30, 0x0b, 0x8f, 0xb6, 0x30, 0xd5, 0x2b, 0xf3, 0x9d, 0x14, 0x41, 0xdc, 0xd1,
10448
++	0x04, 0x7a, 0x45, 0x6a, 0x4e, 0x8a, 0x86, 0x91, 0x16, 0xd7, 0x8a, 0x1c, 0x1d, 0x54, 0x26, 0xb5,
10449
++	0x0f, 0xd1, 0x35, 0x25, 0xf6, 0x97, 0xe5, 0x37, 0xaa, 0xd7, 0xfc, 0x86, 0x5a, 0x2c, 0xa9, 0xd7,
10450
++	0x7c, 0xb5, 0x1c, 0x70, 0x82, 0x43, 0xf7, 0x28, 0x15, 0x41, 0xd2, 0xaf, 0xf9, 0x54, 0x40, 0xc1,
10451
++	0x0c, 0x62, 0xbf, 0x08, 0xb0, 0xf4, 0x90, 0x34, 0xf8, 0x52, 0xd7, 0x1f, 0x20, 0xad, 0xfc, 0x07,
10452
++	0x48, 0xfb, 0x3f, 0x58, 0x30, 0xbe, 0xbc, 0x68, 0x88, 0x89, 0xb3, 0x00, 0x5c, 0x36, 0x7a, 0xeb,
10453
++	0xad, 0x35, 0xa9, 0x5b, 0xe7, 0xea, 0x51, 0x55, 0x8a, 0x35, 0x0c, 0x74, 0x11, 0x8a, 0x5e, 0xdb,
10454
++	0x17, 0x22, 0xcb, 0xd0, 0xe1, 0x41, 0xa5, 0x78, 0xa7, 0xed, 0x63, 0x5a, 0xa6, 0x59, 0x08, 0x16,
10455
++	0xfb, 0xb6, 0x10, 0xec, 0xe9, 0xc9, 0x85, 0x2a, 0x30, 0xf0, 0xe0, 0x81, 0xdb, 0xe4, 0xf6, 0xf2,
10456
++	0x42, 0xef, 0xff, 0xd6, 0x5b, 0x2b, 0xd5, 0x08, 0xf3, 0x72, 0xfb, 0xab, 0x45, 0x98, 0x59, 0xf6,
10457
++	0xc8, 0xc3, 0x0f, 0xe8, 0x33, 0xd0, 0xaf, 0x7d, 0xe3, 0xf1, 0xf8, 0xc5, 0xe3, 0xda, 0xb0, 0xf6,
10458
++	0x1e, 0x8f, 0x4d, 0x18, 0xe2, 0x8f, 0xd9, 0xd2, 0x83, 0xe0, 0xb5, 0xac, 0xd6, 0xf3, 0x07, 0x64,
10459
++	0x96, 0x3f, 0x8a, 0x0b, 0xcf, 0x01, 0x75, 0xd3, 0x8a, 0x52, 0x2c, 0x89, 0xcf, 0x7c, 0x06, 0x46,
10460
++	0x75, 0xcc, 0x63, 0x19, 0xae, 0xff, 0xa5, 0x22, 0x4c, 0xd2, 0x1e, 0x3c, 0xd6, 0x89, 0xb8, 0xd7,
10461
++	0x39, 0x11, 0x27, 0x6d, 0x51, 0xdc, 0x7b, 0x36, 0xde, 0x49, 0xcf, 0xc6, 0x0b, 0x79, 0xb3, 0x71,
10462
++	0xda, 0x73, 0xf0, 0xbd, 0x16, 0x9c, 0x59, 0xf6, 0x82, 0xc6, 0x4e, 0xca, 0xea, 0xf7, 0x65, 0x18,
10463
++	0xa1, 0xe7, 0x78, 0x64, 0x38, 0x2c, 0x19, 0x2e, 0x6c, 0x02, 0x84, 0x75, 0x3c, 0xad, 0xda, 0xbd,
10464
++	0x7b, 0x2b, 0xd5, 0x2c, 0xcf, 0x37, 0x01, 0xc2, 0x3a, 0x9e, 0xfd, 0x0d, 0x0b, 0x2e, 0xdf, 0x5c,
10465
++	0x5c, 0x4a, 0x96, 0x62, 0x96, 0x93, 0x41, 0xab, 0xa9, 0x75, 0x25, 0x91, 0x02, 0xab, 0xac, 0x17,
10466
++	0x02, 0xfa, 0x51, 0x71, 0x2c, 0xfd, 0x59, 0x0b, 0xce, 0xdc, 0x74, 0x63, 0x7a, 0x2d, 0xa7, 0xdd,
10467
++	0xc0, 0xe8, 0xbd, 0x1c, 0xb9, 0x71, 0x10, 0xee, 0xa7, 0xdd, 0xc0, 0xb0, 0x82, 0x60, 0x0d, 0x8b,
10468
++	0xb7, 0xbc, 0xe7, 0x32, 0x33, 0xaa, 0x82, 0xa9, 0x8a, 0xc2, 0xa2, 0x1c, 0x2b, 0x0c, 0xfa, 0x61,
10469
++	0x4d, 0x37, 0x64, 0xa2, 0xc4, 0xbe, 0x38, 0x61, 0xd5, 0x87, 0x55, 0x25, 0x00, 0x27, 0x38, 0xf6,
10470
++	0x4f, 0x58, 0x70, 0xee, 0xa6, 0xd7, 0x8e, 0x62, 0x12, 0x6e, 0x46, 0x46, 0x67, 0x5f, 0x84, 0x32,
10471
++	0x91, 0xe2, 0xba, 0xe8, 0xab, 0x62, 0x30, 0x95, 0x1c, 0xcf, 0x7d, 0xd0, 0x14, 0x5e, 0x1f, 0x9e,
10472
++	0x03, 0xc7, 0xf3, 0x52, 0xfb, 0xc5, 0x02, 0x8c, 0xdd, 0x5a, 0x5f, 0xaf, 0xdd, 0x24, 0xb1, 0xb8,
10473
++	0xc5, 0x7a, 0xab, 0x9a, 0xb1, 0xa6, 0x31, 0xeb, 0x26, 0x14, 0xb5, 0x63, 0xd7, 0x9b, 0xe5, 0x4e,
10474
++	0xcf, 0xb3, 0x2b, 0x7e, 0x7c, 0x37, 0xac, 0xc7, 0xa1, 0xeb, 0x6f, 0x65, 0xea, 0xd8, 0xe4, 0x5d,
10475
++	0x5b, 0xcc, 0xbb, 0x6b, 0xd1, 0x8b, 0x30, 0xc8, 0xbc, 0xae, 0xa5, 0x78, 0xf2, 0x84, 0x92, 0x29,
10476
++	0x58, 0xe9, 0xd1, 0x41, 0xa5, 0x7c, 0x0f, 0xaf, 0xf0, 0x3f, 0x58, 0xa0, 0xa2, 0x7b, 0x30, 0xb2,
10477
++	0x1d, 0xc7, 0xad, 0x5b, 0xc4, 0x69, 0x92, 0x50, 0x9e, 0x0e, 0x57, 0xb2, 0x4e, 0x07, 0x3a, 0x08,
10478
++	0x1c, 0x2d, 0xd9, 0x50, 0x49, 0x59, 0x84, 0x75, 0x3a, 0x76, 0x1d, 0x20, 0x81, 0x9d, 0x90, 0x7e,
10479
++	0xc1, 0xfe, 0x03, 0x0b, 0x86, 0xb8, 0x03, 0x5c, 0x88, 0x3e, 0x0b, 0x25, 0xf2, 0x90, 0x34, 0x04,
10480
++	0xe7, 0x98, 0xd9, 0xe1, 0x84, 0xf1, 0xe0, 0xda, 0x72, 0xfa, 0x1f, 0xb3, 0x5a, 0xe8, 0x16, 0x0c,
10481
++	0xd1, 0xde, 0xde, 0x54, 0xde, 0x80, 0x4f, 0xe6, 0x7d, 0xb1, 0x9a, 0x76, 0xce, 0xab, 0x88, 0x22,
10482
++	0x2c, 0xab, 0x33, 0xcd, 0x6f, 0xa3, 0x55, 0xa7, 0x07, 0x58, 0xdc, 0xed, 0x9e, 0x5d, 0x5f, 0xac,
10483
++	0x71, 0x24, 0x41, 0x8d, 0x6b, 0x7e, 0x65, 0x21, 0x4e, 0x88, 0xd8, 0xeb, 0x50, 0xa6, 0x93, 0x3a,
10484
++	0xef, 0xb9, 0x4e, 0x77, 0xa5, 0xf3, 0xb3, 0x50, 0x96, 0x0a, 0xe0, 0x48, 0xf8, 0x50, 0x31, 0xaa,
10485
++	0x52, 0x3f, 0x1c, 0xe1, 0x04, 0x6e, 0x6f, 0xc2, 0x59, 0xf6, 0xf2, 0xef, 0xc4, 0xdb, 0xc6, 0x1e,
10486
++	0xeb, 0xbd, 0x98, 0x9f, 0x13, 0x82, 0x18, 0x9f, 0x99, 0x69, 0xcd, 0x77, 0x60, 0x54, 0x52, 0x4c,
10487
++	0x84, 0x32, 0xfb, 0x8f, 0x4a, 0xf0, 0xc4, 0x4a, 0x3d, 0xdf, 0x37, 0xf2, 0x55, 0x18, 0xe5, 0x6c,
10488
++	0x1a, 0x5d, 0xda, 0x8e, 0x27, 0xda, 0x55, 0xef, 0x62, 0xeb, 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x32,
10489
++	0x14, 0xdd, 0xf7, 0xfc, 0xb4, 0x19, 0xee, 0xca, 0x9b, 0x6b, 0x98, 0x96, 0x53, 0x30, 0xe5, 0xf8,
10490
++	0xf8, 0x51, 0xaa, 0xc0, 0x8a, 0xeb, 0x7b, 0x1d, 0xc6, 0xdd, 0xa8, 0x11, 0xb9, 0x2b, 0x3e, 0x3d,
10491
++	0x67, 0x12, 0xbf, 0xda, 0x44, 0x49, 0x40, 0x3b, 0xad, 0xa0, 0x38, 0x85, 0xad, 0x9d, 0xeb, 0x03,
10492
++	0x7d, 0x73, 0x8d, 0x3d, 0x3d, 0x7d, 0x28, 0x43, 0xdc, 0x62, 0x5f, 0x17, 0x31, 0xa3, 0x36, 0xc1,
10493
++	0x10, 0xf3, 0x0f, 0x8e, 0xb0, 0x84, 0x51, 0x09, 0xac, 0xb1, 0xed, 0xb4, 0xe6, 0xdb, 0xf1, 0x76,
10494
++	0xd5, 0x8d, 0x1a, 0xc1, 0x1e, 0x09, 0xf7, 0x99, 0xf0, 0x3c, 0x9c, 0x48, 0x60, 0x0a, 0xb0, 0x78,
10495
++	0x6b, 0xbe, 0x46, 0x31, 0x71, 0x67, 0x1d, 0x93, 0x2b, 0x84, 0x93, 0xe0, 0x0a, 0xe7, 0x61, 0x42,
10496
++	0x36, 0x53, 0x27, 0x11, 0xbb, 0x23, 0x46, 0x58, 0xc7, 0x94, 0xa9, 0xad, 0x28, 0x56, 0xdd, 0x4a,
10497
++	0xe3, 0xa3, 0x57, 0x60, 0xcc, 0xf5, 0xdd, 0xd8, 0x75, 0xe2, 0x20, 0x64, 0x37, 0x2c, 0x97, 0x93,
10498
++	0x99, 0x25, 0xdb, 0x8a, 0x0e, 0xc0, 0x26, 0x9e, 0xfd, 0x87, 0x25, 0x98, 0x62, 0xd3, 0xf6, 0xad,
10499
++	0x15, 0xf6, 0x91, 0x59, 0x61, 0xf7, 0x3a, 0x57, 0xd8, 0x49, 0xb0, 0xbb, 0x1f, 0xe6, 0x32, 0x7b,
10500
++	0x17, 0xca, 0xca, 0x16, 0x58, 0x3a, 0x03, 0x58, 0x39, 0xce, 0x00, 0xbd, 0xb9, 0x0f, 0xf9, 0x8c,
10501
++	0x5b, 0xcc, 0x7c, 0xc6, 0xfd, 0xdb, 0x16, 0x24, 0x26, 0x91, 0xe8, 0x16, 0x94, 0x5b, 0x01, 0x33,
10502
++	0x3b, 0x08, 0xa5, 0x2d, 0xcf, 0x13, 0x99, 0x17, 0x15, 0xbf, 0x14, 0xf9, 0xf8, 0xd5, 0x64, 0x0d,
10503
++	0x9c, 0x54, 0x46, 0x0b, 0x30, 0xd4, 0x0a, 0x49, 0x3d, 0x66, 0xde, 0xb6, 0x3d, 0xe9, 0xf0, 0x35,
10504
++	0xc2, 0xf1, 0xb1, 0xac, 0x68, 0xff, 0x92, 0x05, 0xc0, 0x5f, 0x4a, 0x1d, 0x7f, 0x8b, 0x9c, 0x82,
10505
++	0xf6, 0xb7, 0x0a, 0xa5, 0xa8, 0x45, 0x1a, 0xdd, 0x0c, 0x42, 0x92, 0xfe, 0xd4, 0x5b, 0xa4, 0x91,
10506
++	0x0c, 0x38, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xfb, 0x00, 0xc6, 0x13, 0xb4, 0x95, 0x98, 0xec, 0xa2,
10507
++	0xe7, 0x0d, 0x97, 0xb8, 0x8b, 0x29, 0x97, 0xb8, 0x32, 0xc3, 0xd6, 0x14, 0x8d, 0xef, 0x42, 0x71,
10508
++	0xd7, 0x79, 0x28, 0x34, 0x49, 0xcf, 0x76, 0xef, 0x06, 0xa5, 0x3f, 0xbb, 0xea, 0x3c, 0xe4, 0x32,
10509
++	0xd3, 0xb3, 0x72, 0x81, 0xac, 0x3a, 0x0f, 0x8f, 0xb8, 0xd9, 0x07, 0x3b, 0xa4, 0xee, 0xb8, 0x51,
10510
++	0xfc, 0x95, 0xff, 0x9c, 0xfc, 0x67, 0xcb, 0x8e, 0x36, 0xc2, 0xda, 0x72, 0x7d, 0xf1, 0x6e, 0xd8,
10511
++	0x57, 0x5b, 0xae, 0x9f, 0x6e, 0xcb, 0xf5, 0xfb, 0x68, 0xcb, 0xf5, 0xd1, 0xfb, 0x30, 0x24, 0xde,
10512
++	0xe8, 0x99, 0xad, 0xb7, 0xa9, 0xa5, 0xca, 0x6b, 0x4f, 0x3c, 0xf1, 0xf3, 0x36, 0xe7, 0xa4, 0x4c,
10513
++	0x28, 0x4a, 0x7b, 0xb6, 0x2b, 0x1b, 0x44, 0x7f, 0xc3, 0x82, 0x71, 0xf1, 0x1b, 0x93, 0xf7, 0xda,
10514
++	0x24, 0x8a, 0x05, 0xef, 0xf9, 0xe9, 0xfe, 0xfb, 0x20, 0x2a, 0xf2, 0xae, 0x7c, 0x5a, 0x1e, 0xb3,
10515
++	0x26, 0xb0, 0x67, 0x8f, 0x52, 0xbd, 0x40, 0xff, 0xc8, 0x82, 0xb3, 0xbb, 0xce, 0x43, 0xde, 0x22,
10516
++	0x2f, 0xc3, 0x4e, 0xec, 0x06, 0xc2, 0x76, 0xfd, 0xb3, 0xfd, 0x4d, 0x7f, 0x47, 0x75, 0xde, 0x49,
10517
++	0x69, 0xe6, 0x7a, 0x36, 0x0b, 0xa5, 0x67, 0x57, 0x33, 0xfb, 0x35, 0xb3, 0x09, 0xc3, 0x72, 0xbd,
10518
++	0x65, 0x48, 0xde, 0x55, 0x9d, 0xb1, 0x3e, 0xb6, 0x89, 0x84, 0xee, 0x97, 0x46, 0xdb, 0x11, 0x6b,
10519
++	0xed, 0xb1, 0xb6, 0xf3, 0x2e, 0x8c, 0xea, 0x6b, 0xec, 0xb1, 0xb6, 0xf5, 0x1e, 0x9c, 0xc9, 0x58,
10520
++	0x4b, 0x8f, 0xb5, 0xc9, 0x07, 0x70, 0x31, 0x77, 0x7d, 0x3c, 0xce, 0x86, 0xed, 0x5f, 0xb4, 0xf4,
10521
++	0x73, 0xf0, 0x14, 0x54, 0xf0, 0x8b, 0xa6, 0x0a, 0xfe, 0x4a, 0xf7, 0x9d, 0x93, 0xa3, 0x87, 0x7f,
10522
++	0x47, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0x1b, 0x30, 0xe8, 0xd1, 0x12, 0x69, 0x1c, 0x62, 0xf7, 0xde,
10523
++	0x91, 0x09, 0x2f, 0xc5, 0xca, 0x23, 0x2c, 0x28, 0xd8, 0xbf, 0x6a, 0x41, 0xe9, 0x14, 0x46, 0x02,
10524
++	0x9b, 0x23, 0xf1, 0x7c, 0x2e, 0x69, 0x11, 0x3d, 0x6d, 0x16, 0x3b, 0x0f, 0x96, 0x64, 0x84, 0xb8,
10525
++	0x9c, 0x81, 0xf9, 0x2e, 0x38, 0x73, 0x27, 0x70, 0x9a, 0x0b, 0x8e, 0xe7, 0xf8, 0x0d, 0x12, 0xae,
10526
++	0xf8, 0x5b, 0x3d, 0xad, 0x94, 0x74, 0x9b, 0xa2, 0x42, 0x2f, 0x9b, 0x22, 0x7b, 0x1b, 0x90, 0xde,
10527
++	0x80, 0xb0, 0xe3, 0xc4, 0x30, 0xe4, 0xf2, 0xa6, 0xc4, 0xf0, 0x3f, 0x9d, 0xcd, 0xdd, 0x75, 0xf4,
10528
++	0x4c, 0xb3, 0x50, 0xe4, 0x05, 0x58, 0x12, 0xb2, 0x5f, 0x85, 0x4c, 0xdf, 0xad, 0xde, 0x6a, 0x03,
10529
++	0xfb, 0x65, 0x98, 0x62, 0x35, 0x8f, 0x27, 0xd2, 0xda, 0x3f, 0x60, 0xc1, 0xc4, 0x5a, 0x2a, 0x36,
10530
++	0xc5, 0x35, 0xf6, 0xd6, 0x97, 0xa1, 0xf7, 0xad, 0xb3, 0x52, 0x2c, 0xa0, 0x27, 0xae, 0x5f, 0xfa,
10531
++	0x33, 0x0b, 0x12, 0x57, 0xc9, 0x53, 0x60, 0xaa, 0x16, 0x0d, 0xa6, 0x2a, 0x53, 0xef, 0xa1, 0xba,
10532
++	0x93, 0xc7, 0x53, 0xa1, 0xdb, 0x2a, 0x2e, 0x40, 0x17, 0x95, 0x47, 0x42, 0x86, 0x7b, 0x91, 0x8f,
10533
++	0x9b, 0xc1, 0x03, 0x64, 0xa4, 0x00, 0x66, 0x26, 0xa4, 0x70, 0x3f, 0x22, 0x66, 0x42, 0xaa, 0x3f,
10534
++	0x39, 0xbb, 0xaf, 0xa6, 0x75, 0x99, 0x9d, 0x4a, 0xdf, 0xce, 0xcc, 0xbe, 0x1d, 0xcf, 0x7d, 0x9f,
10535
++	0xa8, 0xe0, 0x26, 0x15, 0x61, 0xc6, 0x2d, 0x4a, 0x8f, 0x0e, 0x2a, 0x63, 0xea, 0x1f, 0x0f, 0xb6,
10536
++	0x95, 0x54, 0xb1, 0x6f, 0xc1, 0x44, 0x6a, 0xc0, 0xd0, 0xcb, 0x30, 0xd0, 0xda, 0x76, 0x22, 0x92,
10537
++	0x32, 0x8d, 0x1c, 0xa8, 0xd1, 0xc2, 0xa3, 0x83, 0xca, 0xb8, 0xaa, 0xc0, 0x4a, 0x30, 0xc7, 0xb6,
10538
++	0xff, 0xa7, 0x05, 0xa5, 0xb5, 0xa0, 0x79, 0x1a, 0x8b, 0xe9, 0x75, 0x63, 0x31, 0x5d, 0xca, 0x0b,
10539
++	0x55, 0x98, 0xbb, 0x8e, 0x96, 0x53, 0xeb, 0xe8, 0x4a, 0x2e, 0x85, 0xee, 0x4b, 0x68, 0x17, 0x46,
10540
++	0x58, 0x00, 0x44, 0x61, 0xaa, 0xf9, 0xa2, 0xc1, 0xdf, 0x57, 0x52, 0xfc, 0xfd, 0x84, 0x86, 0xaa,
10541
++	0x71, 0xf9, 0xcf, 0xc0, 0x90, 0x30, 0x17, 0x4c, 0x1b, 0xb8, 0x0b, 0x5c, 0x2c, 0xe1, 0xf6, 0x4f,
10542
++	0x16, 0xc1, 0x08, 0xb8, 0x88, 0x7e, 0xcd, 0x82, 0xd9, 0x90, 0x7b, 0x0c, 0x36, 0xab, 0xed, 0xd0,
10543
++	0xf5, 0xb7, 0xea, 0x8d, 0x6d, 0xd2, 0x6c, 0x7b, 0xae, 0xbf, 0xb5, 0xb2, 0xe5, 0x07, 0xaa, 0x78,
10544
++	0xe9, 0x21, 0x69, 0xb4, 0x99, 0xce, 0xbf, 0x47, 0x74, 0x47, 0x65, 0x8e, 0x73, 0xe3, 0xf0, 0xa0,
10545
++	0x32, 0x8b, 0x8f, 0x45, 0x1b, 0x1f, 0xb3, 0x2f, 0xe8, 0x1b, 0x16, 0xcc, 0xf1, 0x38, 0x84, 0xfd,
10546
++	0xf7, 0xbf, 0x8b, 0x34, 0x54, 0x93, 0xa4, 0x12, 0x22, 0xeb, 0x24, 0xdc, 0x5d, 0x78, 0x45, 0x0c,
10547
++	0xe8, 0x5c, 0xed, 0x78, 0x6d, 0xe1, 0xe3, 0x76, 0xce, 0xfe, 0x97, 0x45, 0x18, 0x13, 0xce, 0xea,
10548
++	0x22, 0x0a, 0xca, 0xcb, 0xc6, 0x92, 0x78, 0x32, 0xb5, 0x24, 0xa6, 0x0c, 0xe4, 0x93, 0x09, 0x80,
10549
++	0x12, 0xc1, 0x94, 0xe7, 0x44, 0xf1, 0x2d, 0xe2, 0x84, 0xf1, 0x06, 0x71, 0xb8, 0x99, 0x4a, 0xf1,
10550
++	0xd8, 0x26, 0x35, 0x4a, 0xfd, 0x72, 0x27, 0x4d, 0x0c, 0x77, 0xd2, 0x47, 0x7b, 0x80, 0x98, 0xad,
10551
++	0x4d, 0xe8, 0xf8, 0x11, 0xff, 0x16, 0x57, 0xbc, 0x07, 0x1c, 0xaf, 0xd5, 0x19, 0xd1, 0x2a, 0xba,
10552
++	0xd3, 0x41, 0x0d, 0x67, 0xb4, 0xa0, 0xd9, 0x50, 0x0d, 0xf4, 0x6b, 0x43, 0x35, 0xd8, 0xc3, 0x8b,
10553
++	0xc4, 0x87, 0xc9, 0x8e, 0x78, 0x03, 0x6f, 0x43, 0x59, 0xd9, 0xba, 0x89, 0x43, 0xa7, 0x7b, 0xd8,
10554
++	0x8e, 0x34, 0x05, 0xae, 0x22, 0x49, 0xec, 0x2c, 0x13, 0x72, 0xf6, 0x3f, 0x2e, 0x18, 0x0d, 0xf2,
10555
++	0x49, 0x5c, 0x83, 0x61, 0x27, 0x8a, 0xdc, 0x2d, 0x9f, 0x34, 0xc5, 0x8e, 0xfd, 0x78, 0xde, 0x8e,
10556
++	0x35, 0x9a, 0x61, 0xf6, 0x86, 0xf3, 0xa2, 0x26, 0x56, 0x34, 0xd0, 0x2d, 0x6e, 0x0c, 0xb4, 0x27,
10557
++	0xf9, 0xf9, 0xfe, 0xa8, 0x81, 0x34, 0x17, 0xda, 0x23, 0x58, 0xd4, 0x47, 0x5f, 0xe4, 0xd6, 0x5a,
10558
++	0xb7, 0xfd, 0xe0, 0x81, 0x7f, 0x33, 0x08, 0xa4, 0x87, 0x59, 0x7f, 0x04, 0xa7, 0xa4, 0x8d, 0x96,
10559
++	0xaa, 0x8e, 0x4d, 0x6a, 0xfd, 0xc5, 0xe4, 0xf9, 0x6e, 0x38, 0x43, 0x49, 0x9b, 0x7e, 0x22, 0x11,
10560
++	0x22, 0x30, 0x21, 0x22, 0x21, 0xc8, 0x32, 0x31, 0x76, 0x99, 0xac, 0xba, 0x59, 0x3b, 0x51, 0xe8,
10561
++	0xdd, 0x36, 0x49, 0xe0, 0x34, 0x4d, 0xfb, 0x67, 0x2c, 0x60, 0x16, 0xee, 0xa7, 0xc0, 0x32, 0x7c,
10562
++	0xce, 0x64, 0x19, 0xa6, 0xf3, 0x06, 0x39, 0x87, 0x5b, 0x78, 0x89, 0xaf, 0xac, 0x5a, 0x18, 0x3c,
10563
++	0xdc, 0x17, 0x2f, 0xe5, 0x7d, 0x70, 0xa9, 0xff, 0xc7, 0xe2, 0x87, 0x98, 0x72, 0x3a, 0x47, 0xdf,
10564
++	0x03, 0xc3, 0x0d, 0xa7, 0xe5, 0x34, 0x78, 0x74, 0xe0, 0x5c, 0x8d, 0x8d, 0x51, 0x69, 0x76, 0x51,
10565
++	0xd4, 0xe0, 0x1a, 0x08, 0x19, 0x51, 0x63, 0x58, 0x16, 0xf7, 0xd4, 0x3a, 0xa8, 0x26, 0x67, 0x76,
10566
++	0x60, 0xcc, 0x20, 0xf6, 0x58, 0xc5, 0xd5, 0xef, 0xe1, 0x57, 0xac, 0x8a, 0x00, 0xb3, 0x0b, 0x53,
10567
++	0xbe, 0xf6, 0x9f, 0x5e, 0x28, 0x52, 0x04, 0xf9, 0x78, 0xaf, 0x4b, 0x94, 0xdd, 0x3e, 0x9a, 0x05,
10568
++	0x7f, 0x8a, 0x0c, 0xee, 0xa4, 0x6c, 0xff, 0x94, 0x05, 0x17, 0x74, 0x44, 0x2d, 0x1e, 0x40, 0x2f,
10569
++	0x1d, 0x70, 0x15, 0x86, 0x83, 0x16, 0x09, 0x9d, 0x38, 0x08, 0xc5, 0xad, 0x71, 0x5d, 0x0e, 0xfa,
10570
++	0x5d, 0x51, 0x7e, 0x24, 0xc2, 0x34, 0x4a, 0xea, 0xb2, 0x1c, 0xab, 0x9a, 0xc8, 0x86, 0x41, 0x36,
10571
++	0x18, 0x91, 0x88, 0xd5, 0xc0, 0xce, 0x00, 0xf6, 0x1c, 0x1a, 0x61, 0x01, 0xb1, 0xff, 0xc8, 0xe2,
10572
++	0x0b, 0x4b, 0xef, 0x3a, 0x7a, 0x0f, 0x26, 0x77, 0x9d, 0xb8, 0xb1, 0xbd, 0xf4, 0xb0, 0x15, 0x72,
10573
++	0xd5, 0xb7, 0x1c, 0xa7, 0x67, 0x7b, 0x8d, 0x93, 0xf6, 0x91, 0x89, 0x01, 0xda, 0x6a, 0x8a, 0x18,
10574
++	0xee, 0x20, 0x8f, 0x36, 0x60, 0x84, 0x95, 0x31, 0x4b, 0xe7, 0xa8, 0x1b, 0x6b, 0x90, 0xd7, 0x9a,
10575
++	0x7a, 0x51, 0x5e, 0x4d, 0xe8, 0x60, 0x9d, 0xa8, 0xfd, 0x95, 0x22, 0xdf, 0xed, 0x8c, 0xdb, 0x7e,
10576
++	0x06, 0x86, 0x5a, 0x41, 0x73, 0x71, 0xa5, 0x8a, 0xc5, 0x2c, 0xa8, 0x6b, 0xa4, 0xc6, 0x8b, 0xb1,
10577
++	0x84, 0xa3, 0xd7, 0x00, 0xc8, 0xc3, 0x98, 0x84, 0xbe, 0xe3, 0x29, 0x83, 0x10, 0x65, 0x02, 0x59,
10578
++	0x0d, 0xd6, 0x82, 0xf8, 0x5e, 0x44, 0xbe, 0x6b, 0x49, 0xa1, 0x60, 0x0d, 0x1d, 0xdd, 0x00, 0x68,
10579
++	0x85, 0xc1, 0x9e, 0xdb, 0x64, 0xae, 0x73, 0x45, 0xd3, 0x5c, 0xa2, 0xa6, 0x20, 0x58, 0xc3, 0x42,
10580
++	0xaf, 0xc1, 0x58, 0xdb, 0x8f, 0x38, 0x87, 0xe2, 0x6c, 0x88, 0xc8, 0x83, 0xc3, 0x89, 0xe5, 0xc2,
10581
++	0x3d, 0x1d, 0x88, 0x4d, 0x5c, 0x34, 0x0f, 0x83, 0xb1, 0xc3, 0xec, 0x1d, 0x06, 0xf2, 0xed, 0x16,
10582
++	0xd7, 0x29, 0x86, 0x1e, 0x9b, 0x96, 0x56, 0xc0, 0xa2, 0x22, 0x7a, 0x5b, 0xfa, 0x21, 0xf0, 0xb3,
10583
++	0x5e, 0x18, 0x0c, 0xf7, 0x77, 0x2f, 0x68, 0x5e, 0x08, 0xc2, 0x10, 0xd9, 0xa0, 0x65, 0x7f, 0xa3,
10584
++	0x0c, 0x90, 0xb0, 0xe3, 0xe8, 0xfd, 0x8e, 0xf3, 0xe8, 0xb9, 0xee, 0x0c, 0xfc, 0xc9, 0x1d, 0x46,
10585
++	0xe8, 0xfb, 0x2d, 0x18, 0x71, 0x3c, 0x2f, 0x68, 0x38, 0x31, 0x1b, 0xe5, 0x42, 0xf7, 0xf3, 0x50,
10586
++	0xb4, 0x3f, 0x9f, 0xd4, 0xe0, 0x5d, 0x78, 0x51, 0x2e, 0x3c, 0x0d, 0xd2, 0xb3, 0x17, 0x7a, 0xc3,
10587
++	0xe8, 0x53, 0x52, 0x4a, 0xe3, 0xcb, 0x63, 0x26, 0x2d, 0xa5, 0x95, 0xd9, 0xd1, 0xaf, 0x09, 0x68,
10588
++	0xe8, 0x9e, 0x11, 0x54, 0xae, 0x94, 0x1f, 0x5f, 0xc1, 0xe0, 0x4a, 0x7b, 0xc5, 0x93, 0x43, 0x35,
10589
++	0xdd, 0x71, 0x6a, 0x20, 0x3f, 0x08, 0x89, 0x26, 0xfe, 0xf4, 0x70, 0x9a, 0x7a, 0x17, 0x26, 0x9a,
10590
++	0xe6, 0xdd, 0x2e, 0x56, 0xd3, 0xd3, 0x79, 0x74, 0x53, 0xac, 0x40, 0x72, 0x9b, 0xa7, 0x00, 0x38,
10591
++	0x4d, 0x18, 0xd5, 0xb8, 0x0b, 0xdb, 0x8a, 0xbf, 0x19, 0x08, 0xc3, 0x73, 0x3b, 0x77, 0x2e, 0xf7,
10592
++	0xa3, 0x98, 0xec, 0x52, 0xcc, 0xe4, 0xd2, 0x5e, 0x13, 0x75, 0xb1, 0xa2, 0x82, 0xde, 0x80, 0x41,
10593
++	0xe6, 0x03, 0x1b, 0x4d, 0x0f, 0xe7, 0x2b, 0x0a, 0xcd, 0xf0, 0x0d, 0xc9, 0xa6, 0x62, 0x7f, 0x23,
10594
++	0x2c, 0x28, 0xa0, 0x5b, 0x32, 0xc6, 0x4b, 0xb4, 0xe2, 0xdf, 0x8b, 0x08, 0x8b, 0xf1, 0x52, 0x5e,
10595
++	0xf8, 0x78, 0x12, 0xbe, 0x85, 0x97, 0x67, 0x46, 0xa1, 0x37, 0x6a, 0x52, 0xe6, 0x48, 0xfc, 0x97,
10596
++	0xc1, 0xed, 0xa7, 0x21, 0xbf, 0x7b, 0x66, 0x00, 0xfc, 0x64, 0x38, 0xef, 0x9b, 0x24, 0x70, 0x9a,
10597
++	0x26, 0x65, 0x34, 0xf9, 0xce, 0x15, 0xa6, 0xeb, 0xbd, 0xf6, 0x3f, 0x97, 0xaf, 0xd9, 0x25, 0xc3,
10598
++	0x4b, 0xb0, 0xa8, 0x7f, 0xaa, 0xb7, 0xfe, 0x8c, 0x0f, 0x93, 0xe9, 0x2d, 0xfa, 0x58, 0xb9, 0x8c,
10599
++	0x3f, 0x28, 0xc1, 0xb8, 0xb9, 0xa4, 0xd0, 0x1c, 0x94, 0x05, 0x11, 0x15, 0x70, 0x54, 0xed, 0x92,
10600
++	0x55, 0x09, 0xc0, 0x09, 0x0e, 0x8b, 0x33, 0xcb, 0xaa, 0x6b, 0x26, 0x87, 0x49, 0x9c, 0x59, 0x05,
10601
++	0xc1, 0x1a, 0x16, 0x95, 0x97, 0x36, 0x82, 0x20, 0x56, 0x97, 0x8a, 0x5a, 0x77, 0x0b, 0xac, 0x14,
10602
++	0x0b, 0x28, 0xbd, 0x4c, 0x76, 0x48, 0xe8, 0x13, 0xcf, 0x8c, 0x63, 0xa6, 0x2e, 0x93, 0xdb, 0x3a,
10603
++	0x10, 0x9b, 0xb8, 0xf4, 0x96, 0x0c, 0x22, 0xb6, 0x90, 0x85, 0x54, 0x96, 0x98, 0x70, 0xd6, 0xb9,
10604
++	0x37, 0xb9, 0x84, 0xa3, 0x2f, 0xc0, 0x05, 0xe5, 0xfc, 0x8d, 0xb9, 0x12, 0x5a, 0xb6, 0x38, 0x68,
10605
++	0x28, 0x51, 0x2e, 0x2c, 0x66, 0xa3, 0xe1, 0xbc, 0xfa, 0xe8, 0x75, 0x18, 0x17, 0x9c, 0xbb, 0xa4,
10606
++	0x38, 0x64, 0xda, 0x45, 0xdc, 0x36, 0xa0, 0x38, 0x85, 0x2d, 0x23, 0xb1, 0x31, 0xe6, 0x59, 0x52,
10607
++	0x18, 0xee, 0x8c, 0xc4, 0xa6, 0xc3, 0x71, 0x47, 0x0d, 0x34, 0x0f, 0x13, 0x9c, 0xb5, 0x72, 0xfd,
10608
++	0x2d, 0x3e, 0x27, 0xc2, 0xb3, 0x44, 0x6d, 0xa9, 0xbb, 0x26, 0x18, 0xa7, 0xf1, 0xd1, 0xab, 0x30,
10609
++	0xea, 0x84, 0x8d, 0x6d, 0x37, 0x26, 0x8d, 0xb8, 0x1d, 0x72, 0x97, 0x13, 0xcd, 0xb0, 0x64, 0x5e,
10610
++	0x83, 0x61, 0x03, 0xd3, 0x7e, 0x1f, 0xce, 0x64, 0x38, 0xa5, 0xd1, 0x85, 0xe3, 0xb4, 0x5c, 0xf9,
10611
++	0x4d, 0x29, 0x63, 0xcc, 0xf9, 0xda, 0x8a, 0xfc, 0x1a, 0x0d, 0x8b, 0xae, 0x4e, 0xe6, 0xbc, 0xa6,
10612
++	0xe5, 0xb2, 0x50, 0xab, 0x73, 0x59, 0x02, 0x70, 0x82, 0x63, 0xff, 0xaf, 0x02, 0x4c, 0x64, 0x28,
10613
++	0xd6, 0x59, 0x3e, 0x85, 0x94, 0xec, 0x91, 0xa4, 0x4f, 0x30, 0x03, 0xfb, 0x15, 0x8e, 0x11, 0xd8,
10614
++	0xaf, 0xd8, 0x2b, 0xb0, 0x5f, 0xe9, 0x83, 0x04, 0xf6, 0x33, 0x47, 0x6c, 0xa0, 0xaf, 0x11, 0xcb,
10615
++	0x08, 0x06, 0x38, 0x78, 0xcc, 0x60, 0x80, 0xc6, 0xa0, 0x0f, 0xf5, 0x31, 0xe8, 0x3f, 0x5a, 0x80,
10616
++	0xc9, 0xb4, 0x01, 0xdc, 0x29, 0xa8, 0x63, 0xdf, 0x30, 0xd4, 0xb1, 0xd9, 0xd9, 0x49, 0xd2, 0x66,
10617
++	0x79, 0x79, 0xaa, 0x59, 0x9c, 0x52, 0xcd, 0x7e, 0xb2, 0x2f, 0x6a, 0xdd, 0xd5, 0xb4, 0x7f, 0xb7,
10618
++	0x00, 0xe7, 0xd2, 0x55, 0x16, 0x3d, 0xc7, 0xdd, 0x3d, 0x85, 0xb1, 0xb9, 0x6b, 0x8c, 0xcd, 0xf3,
10619
++	0xfd, 0x7c, 0x0d, 0xeb, 0x5a, 0xee, 0x00, 0xbd, 0x95, 0x1a, 0xa0, 0xb9, 0xfe, 0x49, 0x76, 0x1f,
10620
++	0xa5, 0x6f, 0x16, 0xe1, 0x4a, 0x66, 0xbd, 0x44, 0x9b, 0xb9, 0x6c, 0x68, 0x33, 0x6f, 0xa4, 0xb4,
10621
++	0x99, 0x76, 0xf7, 0xda, 0x27, 0xa3, 0xde, 0x14, 0xde, 0x82, 0x2c, 0xf8, 0xdb, 0x23, 0xaa, 0x36,
10622
++	0x0d, 0x6f, 0x41, 0x45, 0x08, 0x9b, 0x74, 0xff, 0x22, 0xa9, 0x34, 0xff, 0xad, 0x05, 0x17, 0x33,
10623
++	0xe7, 0xe6, 0x14, 0x54, 0x58, 0x6b, 0xa6, 0x0a, 0xeb, 0x99, 0xbe, 0x57, 0x6b, 0x8e, 0x4e, 0xeb,
10624
++	0x0f, 0x8b, 0x39, 0xdf, 0xc2, 0x04, 0xf4, 0xbb, 0x30, 0xe2, 0x34, 0x1a, 0x24, 0x8a, 0x56, 0x83,
10625
++	0xa6, 0x0a, 0x86, 0xf6, 0x3c, 0x93, 0xb3, 0x92, 0xe2, 0xa3, 0x83, 0xca, 0x4c, 0x9a, 0x44, 0x02,
10626
++	0xc6, 0x3a, 0x05, 0x33, 0x7e, 0x63, 0xe1, 0x44, 0xe3, 0x37, 0xde, 0x00, 0xd8, 0x53, 0xdc, 0x7a,
10627
++	0x5a, 0xc8, 0xd7, 0xf8, 0x78, 0x0d, 0x0b, 0x7d, 0x11, 0x86, 0x23, 0x71, 0x8d, 0x8b, 0xa5, 0xf8,
10628
++	0x62, 0x9f, 0x73, 0xe5, 0x6c, 0x10, 0xcf, 0x74, 0x4b, 0x57, 0xfa, 0x10, 0x45, 0x12, 0x7d, 0x07,
10629
++	0x4c, 0x46, 0x3c, 0xea, 0xc9, 0xa2, 0xe7, 0x44, 0xcc, 0xc7, 0x41, 0xac, 0x42, 0xe6, 0x6b, 0x5e,
10630
++	0x4f, 0xc1, 0x70, 0x07, 0x36, 0x5a, 0x96, 0x1f, 0xc5, 0x42, 0xb4, 0xf0, 0x85, 0x79, 0x2d, 0xf9,
10631
++	0x20, 0x91, 0xcd, 0xe9, 0x6c, 0x7a, 0xf8, 0xd9, 0xc0, 0x6b, 0x35, 0xed, 0x1f, 0x2d, 0xc1, 0x13,
10632
++	0x5d, 0x0e, 0x31, 0x34, 0x6f, 0xbe, 0x51, 0x3e, 0x9b, 0x96, 0x7e, 0x67, 0x32, 0x2b, 0x1b, 0xe2,
10633
++	0x70, 0x6a, 0xad, 0x14, 0x3e, 0xf0, 0x5a, 0xf9, 0x21, 0x4b, 0xd3, 0x4b, 0x70, 0x4b, 0xba, 0xcf,
10634
++	0x1d, 0xf3, 0x70, 0x3e, 0x41, 0x45, 0xc5, 0x66, 0x86, 0xb4, 0x7f, 0xa3, 0xef, 0xee, 0xf4, 0x2d,
10635
++	0xfe, 0x9f, 0xae, 0x76, 0xf6, 0x2b, 0x16, 0x3c, 0x99, 0xd9, 0x5f, 0xc3, 0xa6, 0x62, 0x0e, 0xca,
10636
++	0x0d, 0x5a, 0xa8, 0xf9, 0x4d, 0x25, 0x0e, 0xa5, 0x12, 0x80, 0x13, 0x1c, 0xc3, 0x74, 0xa2, 0xd0,
10637
++	0xd3, 0x74, 0xe2, 0x5f, 0x58, 0xd0, 0xb1, 0x80, 0x4f, 0xe1, 0x24, 0x5d, 0x31, 0x4f, 0xd2, 0x8f,
10638
++	0xf7, 0x33, 0x97, 0x39, 0x87, 0xe8, 0xbf, 0x99, 0x84, 0xf3, 0x39, 0x8e, 0x12, 0x7b, 0x30, 0xb5,
10639
++	0xd5, 0x20, 0xa6, 0x47, 0x9a, 0xf8, 0x98, 0x4c, 0xe7, 0xbd, 0xae, 0xee, 0x6b, 0x2c, 0x0d, 0xcf,
10640
++	0x54, 0x07, 0x0a, 0xee, 0x6c, 0x02, 0x7d, 0xc5, 0x82, 0xb3, 0xce, 0x83, 0xa8, 0x23, 0xd9, 0xa2,
10641
++	0x58, 0x33, 0x2f, 0x65, 0x6a, 0x29, 0x7a, 0x24, 0x67, 0xe4, 0x79, 0x89, 0xb2, 0xb0, 0x70, 0x66,
10642
++	0x5b, 0x08, 0x8b, 0xf8, 0x95, 0x94, 0xdf, 0xee, 0xe2, 0x33, 0x99, 0xe5, 0xd1, 0xc2, 0xcf, 0x54,
10643
++	0x09, 0xc1, 0x8a, 0x0e, 0xba, 0x0f, 0xe5, 0x2d, 0xe9, 0x66, 0x26, 0xce, 0xec, 0xcc, 0x4b, 0x30,
10644
++	0xd3, 0x17, 0x8d, 0xbf, 0x1b, 0x2a, 0x10, 0x4e, 0x48, 0xa1, 0xd7, 0xa1, 0xe8, 0x6f, 0x46, 0xdd,
10645
++	0xb2, 0xec, 0xa4, 0x4c, 0x8d, 0xb8, 0x3f, 0xf2, 0xda, 0x72, 0x1d, 0xd3, 0x8a, 0xe8, 0x16, 0x14,
10646
++	0xc3, 0x8d, 0xa6, 0x50, 0xac, 0x65, 0xf2, 0xa5, 0x78, 0xa1, 0x9a, 0xbd, 0x48, 0x38, 0x25, 0xbc,
10647
++	0x50, 0xc5, 0x94, 0x04, 0xaa, 0xc1, 0x00, 0xf3, 0x29, 0x10, 0xfa, 0xb3, 0x4c, 0x86, 0xb4, 0x8b,
10648
++	0x6f, 0x0e, 0x77, 0x5a, 0x66, 0x08, 0x98, 0x13, 0x42, 0xeb, 0x30, 0xd8, 0x60, 0x19, 0x59, 0x44,
10649
++	0xc8, 0xe4, 0x4f, 0x65, 0xaa, 0xd0, 0xba, 0xa4, 0xaa, 0x11, 0x1a, 0x25, 0x86, 0x81, 0x05, 0x2d,
10650
++	0x46, 0x95, 0xb4, 0xb6, 0x37, 0x23, 0x26, 0x82, 0xe7, 0x51, 0xed, 0x92, 0x81, 0x49, 0x50, 0x65,
10651
++	0x18, 0x58, 0xd0, 0x42, 0x9f, 0x81, 0xc2, 0x66, 0x43, 0xb8, 0x1c, 0x64, 0xea, 0xd2, 0x4c, 0x97,
10652
++	0xf2, 0x85, 0xc1, 0xc3, 0x83, 0x4a, 0x61, 0x79, 0x11, 0x17, 0x36, 0x1b, 0x68, 0x0d, 0x86, 0x36,
10653
++	0xb9, 0x13, 0xaa, 0x50, 0x97, 0x3d, 0x9d, 0xed, 0x1f, 0xdb, 0xe1, 0xa7, 0xca, 0x4d, 0xe5, 0x05,
10654
++	0x00, 0x4b, 0x22, 0x2c, 0x08, 0xa4, 0x72, 0xa6, 0x15, 0xd1, 0x90, 0x67, 0x8f, 0xe7, 0x00, 0xcd,
10655
++	0xdd, 0xdb, 0x13, 0x97, 0x5c, 0xac, 0x51, 0x44, 0x5f, 0x86, 0xb2, 0x23, 0xd3, 0xfc, 0x89, 0x68,
10656
++	0x11, 0x2f, 0x66, 0x6e, 0xcc, 0xee, 0x19, 0x10, 0xf9, 0xaa, 0x56, 0x48, 0x38, 0x21, 0x8a, 0x76,
10657
++	0x60, 0x6c, 0x2f, 0x6a, 0x6d, 0x13, 0xb9, 0x91, 0x59, 0xf0, 0x88, 0x9c, 0x8b, 0xeb, 0xbe, 0x40,
10658
++	0x74, 0xc3, 0xb8, 0xed, 0x78, 0x1d, 0x67, 0x0f, 0x7b, 0x6c, 0xbe, 0xaf, 0x13, 0xc3, 0x26, 0x6d,
10659
++	0x3a, 0xfc, 0xef, 0xb5, 0x83, 0x8d, 0xfd, 0x98, 0x88, 0xf0, 0xc9, 0x99, 0xc3, 0xff, 0x26, 0x47,
10660
++	0xe9, 0x1c, 0x7e, 0x01, 0xc0, 0x92, 0x08, 0xfa, 0x12, 0x8c, 0x34, 0x92, 0x64, 0x61, 0x2c, 0x70,
10661
++	0x72, 0xce, 0x7b, 0x54, 0x4e, 0x4e, 0x31, 0x1e, 0xcd, 0x4e, 0x03, 0x62, 0x9d, 0x20, 0x3b, 0x23,
10662
++	0x5b, 0xdb, 0x41, 0x1c, 0xf8, 0xa9, 0xf3, 0x79, 0x2a, 0xff, 0x8c, 0xac, 0x65, 0xe0, 0x77, 0x9e,
10663
++	0x91, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0xd4, 0x84, 0xf1, 0x56, 0x10, 0xc6, 0x0f, 0x82, 0x50, 0xae,
10664
++	0x33, 0xd4, 0x45, 0xec, 0x37, 0x30, 0x45, 0x8b, 0x2c, 0xac, 0xb7, 0x09, 0xc1, 0x29, 0x9a, 0xe8,
10665
++	0xf3, 0x30, 0x14, 0x35, 0x1c, 0x8f, 0xac, 0xdc, 0x9d, 0x3e, 0x93, 0x7f, 0xf9, 0xd4, 0x39, 0x4a,
10666
++	0xce, 0x2a, 0x63, 0x93, 0x24, 0x50, 0xb0, 0x24, 0x87, 0x96, 0x61, 0x80, 0xc5, 0xe6, 0x67, 0x11,
10667
++	0xa0, 0x73, 0xa2, 0x13, 0x75, 0x18, 0x77, 0xf2, 0x33, 0x8a, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x05,
10668
++	0xc1, 0xfd, 0x06, 0xd1, 0xf4, 0xb9, 0xfc, 0xbd, 0x20, 0x98, 0xe6, 0xbb, 0xf5, 0x6e, 0x7b, 0x41,
10669
++	0x21, 0xe1, 0x84, 0x28, 0x3d, 0xa1, 0xe9, 0xa9, 0x7a, 0xbe, 0x8b, 0xbd, 0x49, 0xee, 0x99, 0xca,
10670
++	0x4e, 0x68, 0x7a, 0xa2, 0x52, 0x12, 0xf4, 0x0e, 0x72, 0x64, 0x6e, 0xd7, 0xe9, 0x0b, 0xf9, 0x77,
10671
++	0x50, 0x66, 0x02, 0x58, 0x6d, 0xb7, 0xb2, 0x65, 0x91, 0x90, 0xb2, 0x7f, 0x6f, 0xa8, 0x93, 0x13,
10672
++	0x62, 0x72, 0xd8, 0x5f, 0xb6, 0x3a, 0x9e, 0xe8, 0x3e, 0xdd, 0xaf, 0x5a, 0xe8, 0x04, 0x79, 0xe0,
10673
++	0xaf, 0x58, 0x70, 0xbe, 0x95, 0x39, 0x40, 0x82, 0xad, 0xe8, 0x4f, 0xbb, 0xc4, 0x87, 0x41, 0x45,
10674
++	0x7f, 0xcf, 0x86, 0xe3, 0x9c, 0x96, 0xd2, 0x72, 0x46, 0xf1, 0x03, 0xcb, 0x19, 0xab, 0x30, 0xcc,
10675
++	0x58, 0xd7, 0x1e, 0x19, 0xd0, 0xd2, 0x5e, 0x6e, 0x8c, 0x41, 0x59, 0x14, 0x15, 0xb1, 0x22, 0x81,
10676
++	0x7e, 0xd8, 0x82, 0xcb, 0xe9, 0xae, 0x63, 0xc2, 0xc0, 0x22, 0x56, 0x3a, 0x17, 0x01, 0x97, 0xc5,
10677
++	0xf7, 0x5f, 0xae, 0x75, 0x43, 0x3e, 0xea, 0x85, 0x80, 0xbb, 0x37, 0x86, 0xaa, 0x19, 0x32, 0xe8,
10678
++	0xa0, 0xa9, 0x77, 0xef, 0x43, 0x0e, 0x7d, 0x09, 0x46, 0x77, 0x83, 0xb6, 0x1f, 0x0b, 0xb3, 0x17,
10679
++	0xe1, 0x84, 0xc8, 0xde, 0x99, 0x57, 0xb5, 0x72, 0x6c, 0x60, 0xa5, 0xa4, 0xd7, 0xe1, 0x47, 0x95,
10680
++	0x5e, 0xd1, 0x3b, 0xa9, 0x94, 0xda, 0xe5, 0xfc, 0x98, 0x7c, 0x42, 0xd0, 0x3f, 0x46, 0x62, 0xed,
10681
++	0xd3, 0x95, 0xb8, 0x7e, 0xce, 0xca, 0x10, 0x15, 0xb8, 0x0c, 0xfe, 0x59, 0x53, 0x06, 0xbf, 0x96,
10682
++	0x96, 0xc1, 0x3b, 0x74, 0xae, 0x86, 0xf8, 0xdd, 0x7f, 0x60, 0xe7, 0x7e, 0x23, 0xa5, 0xd9, 0x1e,
10683
++	0x5c, 0xed, 0x75, 0xdd, 0x31, 0xfb, 0xa7, 0xa6, 0x7a, 0x61, 0x4b, 0xec, 0x9f, 0x9a, 0x2b, 0x55,
10684
++	0xcc, 0x20, 0x7d, 0xe7, 0xeb, 0xfc, 0x6f, 0x16, 0x14, 0x6b, 0x41, 0xf3, 0x14, 0x74, 0xc8, 0x9f,
10685
++	0x33, 0x74, 0xc8, 0x4f, 0xe4, 0xa4, 0x3a, 0xcf, 0xd5, 0x18, 0x2f, 0xa5, 0x34, 0xc6, 0x97, 0xf3,
10686
++	0x08, 0x74, 0xd7, 0x0f, 0xff, 0x74, 0x11, 0xf4, 0xc4, 0xec, 0xe8, 0x5f, 0x3d, 0x8a, 0xf1, 0x71,
10687
++	0xb1, 0x5b, 0xae, 0x76, 0x41, 0x99, 0x99, 0x4d, 0x49, 0xbf, 0xba, 0x3f, 0x67, 0x36, 0xc8, 0x6f,
10688
++	0x11, 0x77, 0x6b, 0x3b, 0x26, 0xcd, 0xf4, 0xe7, 0x9c, 0x9e, 0x0d, 0xf2, 0x7f, 0xb1, 0x60, 0x22,
10689
++	0xd5, 0x3a, 0xf2, 0x60, 0xcc, 0xd3, 0x15, 0x80, 0x62, 0x9d, 0x3e, 0x92, 0xee, 0x50, 0xd8, 0x70,
10690
++	0x6a, 0x45, 0xd8, 0x24, 0x8e, 0x66, 0x01, 0xd4, 0x03, 0x9d, 0xd4, 0xab, 0x31, 0xa9, 0x42, 0xbd,
10691
++	0xe0, 0x45, 0x58, 0xc3, 0x40, 0x2f, 0xc3, 0x48, 0x1c, 0xb4, 0x02, 0x2f, 0xd8, 0xda, 0xbf, 0x4d,
10692
++	0x64, 0xf0, 0x16, 0x65, 0x99, 0xb5, 0x9e, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0x6c, 0x11, 0xd2, 0xc9,
10693
++	0xfc, 0xbf, 0xb5, 0x26, 0x3f, 0x9a, 0x6b, 0xf2, 0x9b, 0x16, 0x4c, 0xd2, 0xd6, 0x99, 0x95, 0x88,
10694
++	0xbc, 0x6c, 0x55, 0x82, 0x19, 0xab, 0x4b, 0x82, 0x99, 0x6b, 0xf4, 0xec, 0x6a, 0x06, 0xed, 0x58,
10695
++	0xe8, 0xe5, 0xb4, 0xc3, 0x89, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x0c, 0x85, 0xeb, 0x93, 0x8e,
10696
++	0x47, 0xc2, 0x10, 0x0b, 0xa8, 0xcc, 0x3f, 0x53, 0xca, 0xc9, 0x3f, 0xc3, 0x42, 0xd1, 0x09, 0x7b,
10697
++	0x02, 0xc1, 0xf6, 0x68, 0xa1, 0xe8, 0xa4, 0xa1, 0x41, 0x82, 0x63, 0xff, 0x62, 0x11, 0x46, 0x6b,
10698
++	0x41, 0x33, 0x79, 0x22, 0x7b, 0xc9, 0x78, 0x22, 0xbb, 0x9a, 0x7a, 0x22, 0x9b, 0xd4, 0x71, 0xbf,
10699
++	0xf5, 0x20, 0xf6, 0x61, 0x3d, 0x88, 0xfd, 0x73, 0x8b, 0xcd, 0x5a, 0x75, 0xad, 0x2e, 0xf2, 0xdf,
10700
++	0xbe, 0x00, 0x23, 0xec, 0x40, 0x62, 0xbe, 0x76, 0xf2, 0xdd, 0x88, 0x09, 0xe3, 0x6b, 0x49, 0x31,
10701
++	0xd6, 0x71, 0xd0, 0x75, 0x18, 0x8e, 0x88, 0x13, 0x36, 0xb6, 0xd5, 0x19, 0x27, 0x5e, 0x55, 0x78,
10702
++	0x19, 0x56, 0x50, 0xf4, 0x66, 0x12, 0x05, 0xad, 0x98, 0x9f, 0xc9, 0x55, 0xef, 0x0f, 0xdf, 0x22,
10703
++	0xf9, 0xa1, 0xcf, 0xec, 0xb7, 0x00, 0x75, 0xe2, 0xf7, 0x11, 0xef, 0xa8, 0x62, 0xc6, 0x3b, 0x2a,
10704
++	0x77, 0xc4, 0x3a, 0xfa, 0x53, 0x0b, 0xc6, 0x6b, 0x41, 0x93, 0x6e, 0xdd, 0xbf, 0x48, 0xfb, 0x54,
10705
++	0x0f, 0x01, 0x39, 0xd8, 0x25, 0x04, 0xe4, 0xdf, 0xb3, 0x60, 0xa8, 0x16, 0x34, 0x4f, 0x41, 0x9b,
10706
++	0xff, 0x59, 0x53, 0x9b, 0x7f, 0x21, 0x67, 0x49, 0xe4, 0x28, 0xf0, 0x7f, 0xb9, 0x08, 0x63, 0xb4,
10707
++	0x9f, 0xc1, 0x96, 0x9c, 0x25, 0x63, 0x44, 0xac, 0x3e, 0x46, 0x84, 0xb2, 0xb9, 0x81, 0xe7, 0x05,
10708
++	0x0f, 0xd2, 0x33, 0xb6, 0xcc, 0x4a, 0xb1, 0x80, 0xa2, 0xe7, 0x60, 0xb8, 0x15, 0x92, 0x3d, 0x37,
10709
++	0x10, 0xfc, 0xa3, 0xf6, 0x36, 0x52, 0x13, 0xe5, 0x58, 0x61, 0x50, 0xb9, 0x2b, 0x72, 0xfd, 0x06,
10710
++	0x91, 0x69, 0xa4, 0x4b, 0x2c, 0xd3, 0x14, 0x8f, 0xed, 0xac, 0x95, 0x63, 0x03, 0x0b, 0xbd, 0x05,
10711
++	0x65, 0xf6, 0x9f, 0x9d, 0x28, 0xc7, 0xcf, 0x8c, 0x23, 0x12, 0x2a, 0x08, 0x02, 0x38, 0xa1, 0x85,
10712
++	0x6e, 0x00, 0xc4, 0x32, 0xfe, 0x6f, 0x24, 0xc2, 0xd6, 0x28, 0x5e, 0x5b, 0x45, 0x06, 0x8e, 0xb0,
10713
++	0x86, 0x85, 0x9e, 0x85, 0x72, 0xec, 0xb8, 0xde, 0x1d, 0xd7, 0x27, 0x11, 0x53, 0x69, 0x17, 0x65,
10714
++	0xbe, 0x04, 0x51, 0x88, 0x13, 0x38, 0xe5, 0x75, 0x98, 0x4f, 0x37, 0xcf, 0xab, 0x35, 0xcc, 0xb0,
10715
++	0x19, 0xaf, 0x73, 0x47, 0x95, 0x62, 0x0d, 0xc3, 0x7e, 0x15, 0xce, 0xd5, 0x82, 0x66, 0x2d, 0x08,
10716
++	0xe3, 0xe5, 0x20, 0x7c, 0xe0, 0x84, 0x4d, 0x39, 0x7f, 0x15, 0x19, 0xba, 0x9f, 0x9e, 0x3d, 0x03,
10717
++	0x7c, 0x67, 0x1a, 0x41, 0xf9, 0x5f, 0x64, 0xdc, 0xce, 0x31, 0x7d, 0x39, 0x1a, 0xec, 0xde, 0x55,
10718
++	0x29, 0xf4, 0x6e, 0x3a, 0x31, 0x41, 0x77, 0x59, 0xda, 0xad, 0xe4, 0x0a, 0x12, 0xd5, 0x9f, 0xd1,
10719
++	0xd2, 0x6e, 0x25, 0xc0, 0xcc, 0x3b, 0xcb, 0xac, 0x6f, 0xff, 0x7a, 0x91, 0x9d, 0x46, 0xa9, 0x8c,
10720
++	0x72, 0xe8, 0x4b, 0x30, 0x1e, 0x91, 0x3b, 0xae, 0xdf, 0x7e, 0x28, 0x85, 0xf0, 0x2e, 0xde, 0x38,
10721
++	0xf5, 0x25, 0x1d, 0x93, 0xab, 0x08, 0xcd, 0x32, 0x9c, 0xa2, 0x46, 0xe7, 0x29, 0x6c, 0xfb, 0xf3,
10722
++	0xd1, 0xbd, 0x88, 0x84, 0x22, 0xa3, 0x19, 0x9b, 0x27, 0x2c, 0x0b, 0x71, 0x02, 0xa7, 0xeb, 0x92,
10723
++	0xfd, 0x59, 0x0b, 0x7c, 0x1c, 0x04, 0xb1, 0x5c, 0xc9, 0x2c, 0x27, 0x8e, 0x56, 0x8e, 0x0d, 0x2c,
10724
++	0xb4, 0x0c, 0x28, 0x6a, 0xb7, 0x5a, 0x1e, 0x7b, 0xcf, 0x77, 0xbc, 0x9b, 0x61, 0xd0, 0x6e, 0xf1,
10725
++	0xb7, 0xd4, 0xe2, 0xc2, 0x79, 0x7a, 0x85, 0xd5, 0x3b, 0xa0, 0x38, 0xa3, 0x06, 0x3d, 0x7d, 0x36,
10726
++	0x23, 0xf6, 0x9b, 0xad, 0xee, 0xa2, 0x50, 0xdf, 0xd7, 0x59, 0x11, 0x96, 0x30, 0xba, 0x98, 0x58,
10727
++	0xf3, 0x1c, 0x73, 0x30, 0x59, 0x4c, 0x58, 0x95, 0x62, 0x0d, 0x03, 0x2d, 0xc1, 0x50, 0xb4, 0x1f,
10728
++	0x35, 0x62, 0x11, 0x64, 0x29, 0x27, 0x37, 0x65, 0x9d, 0xa1, 0x68, 0xf9, 0x12, 0x78, 0x15, 0x2c,
10729
++	0xeb, 0xda, 0xdf, 0xc3, 0x2e, 0x43, 0x96, 0xff, 0x2a, 0x6e, 0x87, 0x04, 0xed, 0xc2, 0x58, 0x8b,
10730
++	0x4d, 0xb9, 0x88, 0xce, 0x2c, 0xe6, 0xed, 0xa5, 0x3e, 0xa5, 0xda, 0x07, 0xf4, 0xa0, 0x51, 0x5a,
10731
++	0x27, 0x26, 0x2e, 0xd4, 0x74, 0x72, 0xd8, 0xa4, 0x6e, 0xff, 0xe0, 0x14, 0x3b, 0x73, 0xeb, 0x5c,
10732
++	0x54, 0x1d, 0x12, 0x16, 0xc5, 0x82, 0x2f, 0x9f, 0xc9, 0xd7, 0x99, 0x24, 0x5f, 0x24, 0xac, 0x92,
10733
++	0xb1, 0xac, 0x8b, 0xde, 0x64, 0x6f, 0xdf, 0xfc, 0xa0, 0xeb, 0x95, 0x86, 0x98, 0x63, 0x19, 0xcf,
10734
++	0xdc, 0xa2, 0x22, 0xd6, 0x88, 0xa0, 0x3b, 0x30, 0x26, 0xd2, 0x25, 0x09, 0xa5, 0x58, 0xd1, 0x50,
10735
++	0x7a, 0x8c, 0x61, 0x1d, 0x78, 0x94, 0x2e, 0xc0, 0x66, 0x65, 0xb4, 0x05, 0x97, 0xb5, 0xdc, 0x81,
10736
++	0x37, 0x43, 0x87, 0xbd, 0x87, 0xba, 0x6c, 0x13, 0x69, 0xe7, 0xe6, 0x93, 0x87, 0x07, 0x95, 0xcb,
10737
++	0xeb, 0xdd, 0x10, 0x71, 0x77, 0x3a, 0xe8, 0x2e, 0x9c, 0xe3, 0x8e, 0x7b, 0x55, 0xe2, 0x34, 0x3d,
10738
++	0xd7, 0x57, 0x07, 0x33, 0x5f, 0x87, 0x17, 0x0f, 0x0f, 0x2a, 0xe7, 0xe6, 0xb3, 0x10, 0x70, 0x76,
10739
++	0x3d, 0xf4, 0x59, 0x28, 0x37, 0xfd, 0x48, 0x8c, 0xc1, 0xa0, 0x91, 0x16, 0xb3, 0x5c, 0x5d, 0xab,
10740
++	0xab, 0xef, 0x4f, 0xfe, 0xe0, 0xa4, 0x02, 0xda, 0xe2, 0x8a, 0x31, 0x25, 0x87, 0x0e, 0xe5, 0xa7,
10741
++	0x40, 0x17, 0x4b, 0xc2, 0x70, 0xdd, 0xe1, 0x1a, 0x61, 0x65, 0xfa, 0x6a, 0x78, 0xf5, 0x18, 0x84,
10742
++	0xd1, 0x1b, 0x80, 0x28, 0xa3, 0xe6, 0x36, 0xc8, 0x7c, 0x83, 0x05, 0xc9, 0x66, 0x7a, 0xc4, 0x61,
10743
++	0xc3, 0x55, 0x02, 0xd5, 0x3b, 0x30, 0x70, 0x46, 0x2d, 0x74, 0x8b, 0x1e, 0x64, 0x7a, 0xa9, 0x30,
10744
++	0xe1, 0x95, 0xcc, 0xfd, 0x74, 0x95, 0xb4, 0x42, 0xd2, 0x70, 0x62, 0xd2, 0x34, 0x29, 0xe2, 0x54,
10745
++	0x3d, 0x7a, 0x97, 0xaa, 0x7c, 0x39, 0x60, 0x46, 0xc2, 0xe8, 0xcc, 0x99, 0x43, 0xe5, 0xe2, 0xed,
10746
++	0x20, 0x8a, 0xd7, 0x48, 0xfc, 0x20, 0x08, 0x77, 0x44, 0xe0, 0xb1, 0x24, 0x06, 0x66, 0x02, 0xc2,
10747
++	0x3a, 0x1e, 0xe5, 0x83, 0xd9, 0xe3, 0xf3, 0x4a, 0x95, 0xbd, 0x00, 0x0e, 0x27, 0xfb, 0xe4, 0x16,
10748
++	0x2f, 0xc6, 0x12, 0x2e, 0x51, 0x57, 0x6a, 0x8b, 0xec, 0x35, 0x2f, 0x85, 0xba, 0x52, 0x5b, 0xc4,
10749
++	0x12, 0x8e, 0x48, 0x67, 0xca, 0xd1, 0xf1, 0x7c, 0xad, 0x66, 0xe7, 0x75, 0xd0, 0x67, 0xd6, 0x51,
10750
++	0x1f, 0x26, 0x55, 0xb2, 0x53, 0x1e, 0x91, 0x2d, 0x9a, 0x9e, 0x60, 0x8b, 0xa4, 0xff, 0x70, 0x6e,
10751
++	0x4a, 0x4f, 0xbc, 0x92, 0xa2, 0x84, 0x3b, 0x68, 0x1b, 0xb1, 0x49, 0x26, 0x7b, 0xe6, 0x3b, 0x9a,
10752
++	0x83, 0x72, 0xd4, 0xde, 0x68, 0x06, 0xbb, 0x8e, 0xeb, 0xb3, 0x47, 0x37, 0x8d, 0xc9, 0xaa, 0x4b,
10753
++	0x00, 0x4e, 0x70, 0xd0, 0x32, 0x0c, 0x3b, 0x52, 0x09, 0x8c, 0xf2, 0x83, 0x15, 0x28, 0xd5, 0x2f,
10754
++	0xf7, 0xdf, 0x95, 0x6a, 0x5f, 0x55, 0x17, 0xbd, 0x06, 0x63, 0xc2, 0x5d, 0x8b, 0x87, 0x70, 0x60,
10755
++	0x8f, 0x62, 0x9a, 0x3d, 0x7e, 0x5d, 0x07, 0x62, 0x13, 0x17, 0x7d, 0x11, 0xc6, 0x29, 0x95, 0xe4,
10756
++	0x60, 0x9b, 0x3e, 0xdb, 0xcf, 0x89, 0xa8, 0xe5, 0xb1, 0xd0, 0x2b, 0xe3, 0x14, 0x31, 0xd4, 0x84,
10757
++	0x4b, 0x4e, 0x3b, 0x0e, 0x98, 0x22, 0xdd, 0x5c, 0xff, 0xeb, 0xc1, 0x0e, 0xf1, 0xd9, 0xdb, 0xd8,
10758
++	0xf0, 0xc2, 0xd5, 0xc3, 0x83, 0xca, 0xa5, 0xf9, 0x2e, 0x78, 0xb8, 0x2b, 0x15, 0x74, 0x0f, 0x46,
10759
++	0xe2, 0xc0, 0x63, 0x96, 0xf1, 0x94, 0x95, 0x38, 0x9f, 0x1f, 0xdb, 0x67, 0x5d, 0xa1, 0xe9, 0x4a,
10760
++	0x24, 0x55, 0x15, 0xeb, 0x74, 0xd0, 0x3a, 0xdf, 0x63, 0x2c, 0xea, 0x29, 0x89, 0xa6, 0x2f, 0xe4,
10761
++	0x0f, 0x8c, 0x0a, 0x8e, 0x6a, 0x6e, 0x41, 0x51, 0x13, 0xeb, 0x64, 0xd0, 0x4d, 0x98, 0x6a, 0x85,
10762
++	0x6e, 0xc0, 0x16, 0xb6, 0x7a, 0xc4, 0x98, 0x36, 0x53, 0x17, 0xd4, 0xd2, 0x08, 0xb8, 0xb3, 0x0e,
10763
++	0x15, 0x32, 0x65, 0xe1, 0xf4, 0x45, 0x9e, 0x07, 0x8b, 0x33, 0xde, 0xbc, 0x0c, 0x2b, 0x28, 0x5a,
10764
++	0x65, 0xe7, 0x32, 0x17, 0x07, 0xa7, 0x67, 0xf2, 0x83, 0x3c, 0xe8, 0x62, 0x23, 0xe7, 0x97, 0xd4,
10765
++	0x5f, 0x9c, 0x50, 0xa0, 0xf7, 0x46, 0xb4, 0xed, 0x84, 0xa4, 0x16, 0x06, 0x0d, 0xc2, 0x3b, 0xc3,
10766
++	0x8d, 0xf2, 0x9f, 0xe0, 0xc1, 0x19, 0xe9, 0xbd, 0x51, 0xcf, 0x42, 0xc0, 0xd9, 0xf5, 0x50, 0x53,
10767
++	0x4b, 0xff, 0x4c, 0xd9, 0xd0, 0x68, 0xfa, 0x52, 0x17, 0x33, 0xa6, 0x14, 0xcf, 0x9a, 0xac, 0x45,
10768
++	0xa3, 0x38, 0xc2, 0x29, 0x9a, 0x33, 0xdf, 0x0e, 0x53, 0x1d, 0xf7, 0xc5, 0xb1, 0xe2, 0x82, 0xff,
10769
++	0xc9, 0x00, 0x94, 0x95, 0x2a, 0x1c, 0xcd, 0x99, 0x2f, 0x1c, 0x17, 0xd3, 0x2f, 0x1c, 0xc3, 0x94,
10770
++	0x23, 0xd7, 0x1f, 0x35, 0xd6, 0x0d, 0xa3, 0xbb, 0x42, 0x7e, 0x16, 0x2e, 0x9d, 0xa7, 0xee, 0xe9,
10771
++	0x61, 0xa7, 0x69, 0x36, 0x8a, 0x7d, 0x3f, 0x95, 0x94, 0xba, 0x2a, 0x4b, 0xfa, 0x4c, 0x82, 0x4b,
10772
++	0x85, 0xff, 0x56, 0xd0, 0x5c, 0xa9, 0xa5, 0xb3, 0x42, 0xd6, 0x68, 0x21, 0xe6, 0x30, 0x26, 0xbe,
10773
++	0x51, 0xe6, 0x86, 0x89, 0x6f, 0x43, 0x8f, 0x28, 0xbe, 0x49, 0x02, 0x38, 0xa1, 0x85, 0x3c, 0x98,
10774
++	0x6a, 0x98, 0x09, 0x3d, 0x95, 0x57, 0xdd, 0x53, 0x3d, 0x53, 0x6b, 0xb6, 0xb5, 0xec, 0x69, 0x8b,
10775
++	0x69, 0x2a, 0xb8, 0x93, 0x30, 0x7a, 0x0d, 0x86, 0xdf, 0x0b, 0x22, 0xb6, 0xf9, 0xc4, 0x0d, 0x2f,
10776
++	0xbd, 0x8f, 0x86, 0xdf, 0xbc, 0x5b, 0x67, 0xe5, 0x47, 0x07, 0x95, 0x91, 0x5a, 0xd0, 0x94, 0x7f,
10777
++	0xb1, 0xaa, 0x80, 0x1e, 0xc2, 0x39, 0xe3, 0x5c, 0x54, 0xdd, 0x85, 0xfe, 0xbb, 0x7b, 0x59, 0x34,
10778
++	0x77, 0x6e, 0x25, 0x8b, 0x12, 0xce, 0x6e, 0x80, 0x1e, 0x36, 0x7e, 0x20, 0x92, 0xe1, 0x4a, 0x2e,
10779
++	0x82, 0x31, 0x0b, 0x65, 0xdd, 0xf7, 0x3c, 0x85, 0x80, 0x3b, 0xeb, 0xd8, 0x5f, 0xe3, 0x2f, 0x07,
10780
++	0x42, 0xbf, 0x48, 0xa2, 0xb6, 0x77, 0x1a, 0xb9, 0x96, 0x96, 0x0c, 0xd5, 0xe7, 0x23, 0xbf, 0x4e,
10781
++	0xfd, 0xa6, 0xc5, 0x5e, 0xa7, 0xd6, 0xc9, 0x6e, 0xcb, 0xa3, 0x52, 0xee, 0xe3, 0xef, 0xf8, 0x9b,
10782
++	0x30, 0x1c, 0x8b, 0xd6, 0xba, 0xa5, 0x87, 0xd2, 0x3a, 0xc5, 0x5e, 0xe8, 0x14, 0x7f, 0x21, 0x4b,
10783
++	0xb1, 0x22, 0x63, 0xff, 0x53, 0x3e, 0x03, 0x12, 0x72, 0x0a, 0x6a, 0xa8, 0xaa, 0xa9, 0x86, 0xaa,
10784
++	0xf4, 0xf8, 0x82, 0x1c, 0x75, 0xd4, 0x3f, 0x31, 0xfb, 0xcd, 0x44, 0xb9, 0x8f, 0xfa, 0xb3, 0xa8,
10785
++	0xfd, 0x63, 0x16, 0x9c, 0xcd, 0xb2, 0x4f, 0xa2, 0x3c, 0x21, 0x17, 0x24, 0xd5, 0x33, 0xb1, 0x1a,
10786
++	0xc1, 0xfb, 0xa2, 0x1c, 0x2b, 0x8c, 0xbe, 0x33, 0x2f, 0x1c, 0x2f, 0x3c, 0xdb, 0x5d, 0x18, 0xab,
10787
++	0x85, 0x44, 0xbb, 0x03, 0x5e, 0xe7, 0x6e, 0x6c, 0xbc, 0x3f, 0xcf, 0x1d, 0xdb, 0x85, 0xcd, 0xfe,
10788
++	0xf9, 0x02, 0x9c, 0xe5, 0xef, 0x3c, 0xf3, 0x7b, 0x81, 0xdb, 0xac, 0x05, 0x4d, 0x91, 0x35, 0xe3,
10789
++	0x6d, 0x18, 0x6d, 0x69, 0xd2, 0x7f, 0xb7, 0x00, 0x51, 0xba, 0x96, 0x20, 0x91, 0xc2, 0xf4, 0x52,
10790
++	0x6c, 0xd0, 0x42, 0x4d, 0x18, 0x25, 0x7b, 0x6e, 0x43, 0x3d, 0x16, 0x14, 0x8e, 0x7d, 0x37, 0xa8,
10791
++	0x56, 0x96, 0x34, 0x3a, 0xd8, 0xa0, 0xfa, 0x18, 0x12, 0xa9, 0xd9, 0x3f, 0x6e, 0xc1, 0x85, 0x9c,
10792
++	0x70, 0x52, 0xb4, 0xb9, 0x07, 0xec, 0x45, 0x4d, 0xe4, 0x64, 0x52, 0xcd, 0xf1, 0x77, 0x36, 0x2c,
10793
++	0xa0, 0xe8, 0xf3, 0x00, 0xfc, 0x9d, 0x8c, 0x0a, 0x25, 0xbd, 0xe2, 0xee, 0x18, 0x21, 0x43, 0xb4,
10794
++	0x50, 0x0f, 0xb2, 0x3e, 0xd6, 0x68, 0xd9, 0x3f, 0x53, 0x84, 0x01, 0xf6, 0x2e, 0x83, 0x96, 0x61,
10795
++	0x68, 0x9b, 0x07, 0x4f, 0xee, 0x27, 0x4e, 0x73, 0x22, 0xdd, 0xf1, 0x02, 0x2c, 0x2b, 0xa3, 0x55,
10796
++	0x38, 0xc3, 0x83, 0x4f, 0x7b, 0x55, 0xe2, 0x39, 0xfb, 0x52, 0x49, 0xc0, 0xf3, 0x18, 0xa9, 0xb0,
10797
++	0x15, 0x2b, 0x9d, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x1d, 0xc6, 0x63, 0x77, 0x97, 0x04, 0xed, 0x58,
10798
++	0x52, 0xe2, 0x61, 0xa7, 0x15, 0x1b, 0xb7, 0x6e, 0x40, 0x71, 0x0a, 0x9b, 0x8a, 0x3b, 0xad, 0x0e,
10799
++	0x75, 0xc8, 0x40, 0x22, 0xee, 0x98, 0x2a, 0x10, 0x13, 0x97, 0x19, 0x10, 0xb5, 0x99, 0xb9, 0xd4,
10800
++	0xfa, 0x76, 0x48, 0xa2, 0xed, 0xc0, 0x6b, 0x8a, 0x34, 0xd8, 0x89, 0x01, 0x51, 0x0a, 0x8e, 0x3b,
10801
++	0x6a, 0x50, 0x2a, 0x9b, 0x8e, 0xeb, 0xb5, 0x43, 0x92, 0x50, 0x19, 0x34, 0xa9, 0x2c, 0xa7, 0xe0,
10802
++	0xb8, 0xa3, 0x06, 0x5d, 0x47, 0xe7, 0x44, 0x5e, 0x6a, 0xe9, 0x4c, 0xaf, 0xac, 0xc2, 0x86, 0xa4,
10803
++	0x5b, 0x51, 0x97, 0x68, 0x32, 0xc2, 0x6e, 0x46, 0x65, 0xb6, 0xd6, 0xb4, 0x78, 0xc2, 0xa1, 0x48,
10804
++	0x52, 0x79, 0x94, 0xec, 0xc8, 0xbf, 0x67, 0xc1, 0x99, 0x0c, 0xeb, 0x56, 0x7e, 0x54, 0x6d, 0xb9,
10805
++	0x51, 0xac, 0x72, 0xb5, 0x68, 0x47, 0x15, 0x2f, 0xc7, 0x0a, 0x83, 0xee, 0x07, 0x7e, 0x18, 0xa6,
10806
++	0x0f, 0x40, 0x61, 0xdd, 0x25, 0xa0, 0xc7, 0x3b, 0x00, 0xd1, 0x55, 0x28, 0xb5, 0x23, 0x22, 0xe3,
10807
++	0x40, 0xa9, 0xf3, 0x9b, 0xe9, 0x75, 0x19, 0x84, 0xb2, 0xa6, 0x5b, 0x4a, 0xa5, 0xaa, 0xb1, 0xa6,
10808
++	0x5c, 0x4f, 0xca, 0x61, 0xf6, 0x57, 0x8b, 0x70, 0x31, 0xd7, 0x8e, 0x9d, 0x76, 0x69, 0x37, 0xf0,
10809
++	0xdd, 0x38, 0x50, 0x6f, 0x7e, 0x3c, 0x12, 0x09, 0x69, 0x6d, 0xaf, 0x8a, 0x72, 0xac, 0x30, 0xd0,
10810
++	0x35, 0x99, 0x21, 0x3d, 0x9d, 0x8d, 0x66, 0xa1, 0x6a, 0x24, 0x49, 0xef, 0x37, 0xd3, 0xd7, 0x53,
10811
++	0x50, 0x6a, 0x05, 0x81, 0x97, 0x3e, 0x8c, 0x68, 0x77, 0x83, 0xc0, 0xc3, 0x0c, 0x88, 0x3e, 0x21,
10812
++	0xc6, 0x21, 0xf5, 0xc8, 0x85, 0x9d, 0x66, 0x10, 0x69, 0x83, 0xf1, 0x0c, 0x0c, 0xed, 0x90, 0xfd,
10813
++	0xd0, 0xf5, 0xb7, 0xd2, 0x8f, 0x9f, 0xb7, 0x79, 0x31, 0x96, 0x70, 0x33, 0x19, 0xc3, 0xd0, 0x49,
10814
++	0xa7, 0xe8, 0x1a, 0xee, 0x79, 0xb5, 0xfd, 0x50, 0x11, 0x26, 0xf0, 0x42, 0xf5, 0x5b, 0x13, 0x71,
10815
++	0xaf, 0x73, 0x22, 0x4e, 0x3a, 0x45, 0x57, 0xef, 0xd9, 0xf8, 0x65, 0x0b, 0x26, 0x58, 0xc0, 0x62,
10816
++	0x11, 0xff, 0xc2, 0x0d, 0xfc, 0x53, 0x60, 0xdd, 0x9e, 0x82, 0x81, 0x90, 0x36, 0x9a, 0xce, 0xbb,
10817
++	0xc3, 0x7a, 0x82, 0x39, 0x0c, 0x5d, 0x82, 0x12, 0xeb, 0x02, 0x9d, 0xbc, 0x51, 0x9e, 0xb2, 0xa0,
10818
++	0xea, 0xc4, 0x0e, 0x66, 0xa5, 0xcc, 0xa9, 0x1b, 0x93, 0x96, 0xe7, 0xf2, 0x4e, 0x27, 0x0f, 0x0a,
10819
++	0x1f, 0x0d, 0xa7, 0xee, 0xcc, 0xae, 0x7d, 0x30, 0xa7, 0xee, 0x6c, 0x92, 0xdd, 0xc5, 0xa2, 0xff,
10820
++	0x5e, 0x80, 0x2b, 0x99, 0xf5, 0xfa, 0x76, 0xea, 0xee, 0x5e, 0xfb, 0x64, 0x6c, 0x58, 0xb2, 0x4d,
10821
++	0x4b, 0x8a, 0xa7, 0x68, 0x5a, 0x52, 0xea, 0x97, 0x73, 0x1c, 0xe8, 0xc3, 0xd7, 0x3a, 0x73, 0xc8,
10822
++	0x3e, 0x22, 0xbe, 0xd6, 0x99, 0x7d, 0xcb, 0x11, 0xeb, 0xfe, 0xac, 0x90, 0xf3, 0x2d, 0x4c, 0xc0,
10823
++	0xbb, 0x4e, 0xcf, 0x19, 0x06, 0x8c, 0x04, 0x27, 0x3c, 0xca, 0xcf, 0x18, 0x5e, 0x86, 0x15, 0x14,
10824
++	0xb9, 0x9a, 0xd7, 0x72, 0x21, 0x3f, 0x2b, 0x63, 0x6e, 0x53, 0xb3, 0xe6, 0xfb, 0x8f, 0x1a, 0x82,
10825
++	0x0c, 0x0f, 0xe6, 0x55, 0x4d, 0x28, 0x2f, 0xf6, 0x2f, 0x94, 0x8f, 0x66, 0x0b, 0xe4, 0x68, 0x1e,
10826
++	0x26, 0x76, 0x5d, 0x9f, 0x65, 0xd9, 0x37, 0x59, 0x51, 0x15, 0xc4, 0x63, 0xd5, 0x04, 0xe3, 0x34,
10827
++	0xfe, 0xcc, 0x6b, 0x30, 0xf6, 0xe8, 0xea, 0xc8, 0x6f, 0x16, 0xe1, 0x89, 0x2e, 0xdb, 0x9e, 0x9f,
10828
++	0xf5, 0xc6, 0x1c, 0x68, 0x67, 0x7d, 0xc7, 0x3c, 0xd4, 0xe0, 0xec, 0x66, 0xdb, 0xf3, 0xf6, 0x99,
10829
++	0xf5, 0x26, 0x69, 0x4a, 0x0c, 0xc1, 0x2b, 0x5e, 0x92, 0x49, 0x22, 0x96, 0x33, 0x70, 0x70, 0x66,
10830
++	0x4d, 0xf4, 0x06, 0xa0, 0x40, 0xa4, 0x84, 0xbd, 0x49, 0x7c, 0xa1, 0x55, 0x67, 0x03, 0x5f, 0x4c,
10831
++	0x36, 0xe3, 0xdd, 0x0e, 0x0c, 0x9c, 0x51, 0x8b, 0x32, 0xfd, 0xf4, 0x56, 0xda, 0x57, 0xdd, 0x4a,
10832
++	0x31, 0xfd, 0x58, 0x07, 0x62, 0x13, 0x17, 0xdd, 0x84, 0x29, 0x67, 0xcf, 0x71, 0x79, 0x70, 0x3b,
10833
++	0x49, 0x80, 0x73, 0xfd, 0x4a, 0x09, 0x36, 0x9f, 0x46, 0xc0, 0x9d, 0x75, 0x52, 0x6e, 0xd3, 0x83,
10834
++	0xf9, 0x6e, 0xd3, 0xdd, 0xcf, 0xc5, 0x5e, 0x3a, 0x5d, 0xfb, 0x3f, 0x59, 0xf4, 0xfa, 0xca, 0x48,
10835
++	0xeb, 0x4e, 0xc7, 0x41, 0xe9, 0x26, 0x35, 0x0f, 0xe6, 0x73, 0x9a, 0x7d, 0x46, 0x02, 0xc4, 0x26,
10836
++	0x2e, 0x5f, 0x10, 0x51, 0xe2, 0xe2, 0x62, 0xb0, 0xee, 0x22, 0x44, 0x81, 0xc2, 0x40, 0x5f, 0x80,
10837
++	0xa1, 0xa6, 0xbb, 0xe7, 0x46, 0x41, 0x28, 0x36, 0xcb, 0x31, 0x1d, 0x05, 0x92, 0x73, 0xb0, 0xca,
10838
++	0xc9, 0x60, 0x49, 0xcf, 0xfe, 0xa1, 0x02, 0x8c, 0xc9, 0x16, 0xdf, 0x6c, 0x07, 0xb1, 0x73, 0x0a,
10839
++	0xd7, 0xf2, 0x4d, 0xe3, 0x5a, 0xfe, 0x44, 0xb7, 0x38, 0x0d, 0xac, 0x4b, 0xb9, 0xd7, 0xf1, 0xdd,
10840
++	0xd4, 0x75, 0xfc, 0x74, 0x6f, 0x52, 0xdd, 0xaf, 0xe1, 0x7f, 0x66, 0xc1, 0x94, 0x81, 0x7f, 0x0a,
10841
++	0xb7, 0xc1, 0xb2, 0x79, 0x1b, 0x3c, 0xd9, 0xf3, 0x1b, 0x72, 0x6e, 0x81, 0xef, 0x2b, 0xa6, 0xfa,
10842
++	0xce, 0x4e, 0xff, 0xf7, 0xa0, 0xb4, 0xed, 0x84, 0xcd, 0x6e, 0xf1, 0x60, 0x3b, 0x2a, 0xcd, 0xde,
10843
++	0x72, 0xc2, 0x26, 0x3f, 0xc3, 0x9f, 0x53, 0x89, 0x24, 0x9d, 0xb0, 0xd9, 0xd3, 0xa3, 0x8b, 0x35,
10844
++	0x85, 0x5e, 0x85, 0xc1, 0xa8, 0x11, 0xb4, 0x94, 0xbd, 0xe5, 0x55, 0x9e, 0x64, 0x92, 0x96, 0x1c,
10845
++	0x1d, 0x54, 0x90, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x1f, 0xbd, 0x0d, 0x63, 0xec, 0x97, 0xb2, 0x3b,
10846
++	0x28, 0xe6, 0x67, 0x21, 0xa8, 0xeb, 0x88, 0xdc, 0x7c, 0xc5, 0x28, 0xc2, 0x26, 0xa9, 0x99, 0x2d,
10847
++	0x28, 0xab, 0xcf, 0x7a, 0xac, 0x9e, 0x38, 0xff, 0xbe, 0x08, 0x67, 0x32, 0xd6, 0x1c, 0x8a, 0x8c,
10848
++	0x99, 0x78, 0xa1, 0xcf, 0xa5, 0xfa, 0x01, 0xe7, 0x22, 0x62, 0xd2, 0x50, 0x53, 0xac, 0xad, 0xbe,
10849
++	0x1b, 0xbd, 0x17, 0x91, 0x74, 0xa3, 0xb4, 0xa8, 0x77, 0xa3, 0xb4, 0xb1, 0x53, 0x1b, 0x6a, 0xda,
10850
++	0x90, 0xea, 0xe9, 0x63, 0x9d, 0xd3, 0x3f, 0x2e, 0xc2, 0xd9, 0xac, 0xd0, 0x31, 0xe8, 0xbb, 0x53,
10851
++	0xd9, 0x66, 0x5e, 0xea, 0x37, 0xe8, 0x0c, 0x4f, 0x41, 0x23, 0x72, 0x27, 0xcf, 0x9a, 0xf9, 0x67,
10852
++	0x7a, 0x0e, 0xb3, 0x68, 0x93, 0xb9, 0x6f, 0x86, 0x3c, 0x4b, 0x90, 0x3c, 0x3e, 0x3e, 0xdd, 0x77,
10853
++	0x07, 0x44, 0x7a, 0xa1, 0x28, 0xe5, 0xbe, 0x29, 0x8b, 0x7b, 0xbb, 0x6f, 0xca, 0x96, 0x67, 0x5c,
10854
++	0x18, 0xd1, 0xbe, 0xe6, 0xb1, 0xce, 0xf8, 0x0e, 0xbd, 0xad, 0xb4, 0x7e, 0x3f, 0xd6, 0x59, 0xff,
10855
++	0x71, 0x0b, 0x52, 0xc6, 0x8d, 0x4a, 0xdd, 0x65, 0xe5, 0xaa, 0xbb, 0xae, 0x42, 0x29, 0x0c, 0x3c,
10856
++	0x92, 0x4e, 0x00, 0x83, 0x03, 0x8f, 0x60, 0x06, 0xa1, 0x18, 0x71, 0xa2, 0xec, 0x18, 0xd5, 0x05,
10857
++	0x39, 0x21, 0xa2, 0x3d, 0x05, 0x03, 0x1e, 0xd9, 0x23, 0x5e, 0x3a, 0xba, 0xfa, 0x1d, 0x5a, 0x88,
10858
++	0x39, 0xcc, 0xfe, 0xe5, 0x12, 0x5c, 0xee, 0xea, 0x58, 0x4d, 0xc5, 0xa1, 0x2d, 0x27, 0x26, 0x0f,
10859
++	0x9c, 0xfd, 0x74, 0x18, 0xe4, 0x9b, 0xbc, 0x18, 0x4b, 0x38, 0xb3, 0xf7, 0xe6, 0x61, 0x0f, 0x53,
10860
++	0xca, 0x41, 0x11, 0xed, 0x50, 0x40, 0x1f, 0x43, 0xde, 0xf8, 0x1b, 0x00, 0x51, 0xe4, 0x2d, 0xf9,
10861
++	0x94, 0xbb, 0x6b, 0x0a, 0x43, 0xf2, 0x24, 0x3c, 0x66, 0xfd, 0x8e, 0x80, 0x60, 0x0d, 0x0b, 0x55,
10862
++	0x61, 0xb2, 0x15, 0x06, 0x31, 0xd7, 0xb5, 0x56, 0xb9, 0x99, 0xcf, 0x80, 0xe9, 0x7b, 0x5a, 0x4b,
10863
++	0xc1, 0x71, 0x47, 0x0d, 0xf4, 0x32, 0x8c, 0x08, 0x7f, 0xd4, 0x5a, 0x10, 0x78, 0x42, 0x0d, 0xa4,
10864
++	0x8c, 0x46, 0xea, 0x09, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0xa6, 0xc0, 0x1d, 0xca, 0xac, 0xc6, 0x95,
10865
++	0xb8, 0x1a, 0x5e, 0x2a, 0x8c, 0xd4, 0x70, 0x5f, 0x61, 0xa4, 0x12, 0xc5, 0x58, 0xb9, 0xef, 0x37,
10866
++	0x2b, 0xe8, 0xa9, 0x4a, 0xfa, 0x85, 0x12, 0x9c, 0x11, 0x0b, 0xe7, 0x71, 0x2f, 0x97, 0xc7, 0x94,
10867
++	0xdd, 0xfe, 0x5b, 0x6b, 0xe6, 0xb4, 0xd7, 0xcc, 0x0f, 0x5b, 0x60, 0xb2, 0x57, 0xe8, 0xff, 0xcb,
10868
++	0x8d, 0x23, 0xff, 0x72, 0x2e, 0xbb, 0xd6, 0x94, 0x17, 0xc8, 0x07, 0x8c, 0x28, 0x6f, 0xff, 0x47,
10869
++	0x0b, 0x9e, 0xec, 0x49, 0x11, 0x2d, 0x41, 0x99, 0xf1, 0x80, 0x9a, 0x74, 0xf6, 0xb4, 0x32, 0x03,
10870
++	0x94, 0x80, 0x1c, 0x96, 0x34, 0xa9, 0x89, 0x96, 0x3a, 0x02, 0xf6, 0x3f, 0x93, 0x11, 0xb0, 0xff,
10871
++	0x9c, 0x31, 0x3c, 0x8f, 0x18, 0xb1, 0xff, 0x6b, 0x45, 0x18, 0xe4, 0x2b, 0xfe, 0x14, 0xc4, 0xb0,
10872
++	0x65, 0xa1, 0xb7, 0xed, 0x12, 0xa7, 0x8a, 0xf7, 0x65, 0xb6, 0xea, 0xc4, 0x0e, 0x67, 0x13, 0xd4,
10873
++	0x6d, 0x95, 0x68, 0x78, 0xd1, 0xac, 0x71, 0x9f, 0xcd, 0xa4, 0x14, 0x93, 0xc0, 0x69, 0x68, 0xb7,
10874
++	0xdb, 0x97, 0x00, 0x22, 0x96, 0xc8, 0x9e, 0xd2, 0x10, 0x11, 0xcf, 0x3e, 0xd9, 0xa5, 0xf5, 0xba,
10875
++	0x42, 0xe6, 0x7d, 0x48, 0x76, 0xba, 0x02, 0x60, 0x8d, 0xe2, 0xcc, 0x2b, 0x50, 0x56, 0xc8, 0xbd,
10876
++	0xb4, 0x38, 0xa3, 0x3a, 0x73, 0xf1, 0x39, 0x98, 0x48, 0xb5, 0x75, 0x2c, 0x25, 0xd0, 0xaf, 0x58,
10877
++	0x30, 0xc1, 0xbb, 0xbc, 0xe4, 0xef, 0x89, 0x33, 0xf5, 0x7d, 0x38, 0xeb, 0x65, 0x9c, 0x6d, 0x62,
10878
++	0x46, 0xfb, 0x3f, 0x0b, 0x95, 0xd2, 0x27, 0x0b, 0x8a, 0x33, 0xdb, 0x40, 0xd7, 0xe9, 0xba, 0xa5,
10879
++	0x67, 0x97, 0xe3, 0x09, 0xdf, 0xa1, 0x51, 0xbe, 0x66, 0x79, 0x19, 0x56, 0x50, 0xfb, 0x77, 0x2c,
10880
++	0x98, 0xe2, 0x3d, 0xbf, 0x4d, 0xf6, 0xd5, 0x0e, 0xff, 0x30, 0xfb, 0x2e, 0x72, 0x68, 0x14, 0x72,
10881
++	0x72, 0x68, 0xe8, 0x9f, 0x56, 0xec, 0xfa, 0x69, 0x3f, 0x6f, 0x81, 0x58, 0x81, 0xa7, 0x20, 0xca,
10882
++	0x7f, 0xbb, 0x29, 0xca, 0xcf, 0xe4, 0x2f, 0xea, 0x1c, 0x19, 0xfe, 0x4f, 0x2d, 0x98, 0xe4, 0x08,
10883
++	0xc9, 0x5b, 0xf2, 0x87, 0x3a, 0x0f, 0xfd, 0x24, 0xc3, 0x53, 0xd9, 0xaf, 0xb3, 0x3f, 0xca, 0x98,
10884
++	0xac, 0x52, 0xd7, 0xc9, 0x6a, 0xca, 0x0d, 0x74, 0x8c, 0x24, 0x8f, 0xc7, 0x8e, 0x45, 0x6d, 0xff,
10885
++	0x91, 0x05, 0x88, 0x37, 0x63, 0xb0, 0x3f, 0x94, 0xa9, 0x60, 0xa5, 0xda, 0x75, 0x91, 0x1c, 0x35,
10886
++	0x0a, 0x82, 0x35, 0xac, 0x13, 0x19, 0x9e, 0x94, 0x41, 0x40, 0xb1, 0xb7, 0x41, 0xc0, 0x31, 0x46,
10887
++	0xf4, 0x6b, 0x25, 0x48, 0x1b, 0xf3, 0xa3, 0xfb, 0x30, 0xda, 0x70, 0x5a, 0xce, 0x86, 0xeb, 0xb9,
10888
++	0xb1, 0x4b, 0xa2, 0x6e, 0x96, 0x44, 0x8b, 0x1a, 0x9e, 0x78, 0xea, 0xd5, 0x4a, 0xb0, 0x41, 0x07,
10889
++	0xcd, 0x02, 0xb4, 0x42, 0x77, 0xcf, 0xf5, 0xc8, 0x16, 0xd3, 0x38, 0x30, 0x6f, 0x45, 0x6e, 0x1e,
10890
++	0x23, 0x4b, 0xb1, 0x86, 0x91, 0xe1, 0x78, 0x56, 0x7c, 0x7c, 0x8e, 0x67, 0xa5, 0x63, 0x3a, 0x9e,
10891
++	0x0d, 0xf4, 0xe5, 0x78, 0x86, 0xe1, 0xbc, 0x64, 0x91, 0xe8, 0xff, 0x65, 0xd7, 0x23, 0x82, 0x2f,
10892
++	0xe6, 0x3e, 0x8c, 0x33, 0x87, 0x07, 0x95, 0xf3, 0x38, 0x13, 0x03, 0xe7, 0xd4, 0x44, 0x9f, 0x87,
10893
++	0x69, 0xc7, 0xf3, 0x82, 0x07, 0x6a, 0xd4, 0x96, 0xa2, 0x86, 0xe3, 0x71, 0x8d, 0xfd, 0x10, 0xa3,
10894
++	0x7a, 0xe9, 0xf0, 0xa0, 0x32, 0x3d, 0x9f, 0x83, 0x83, 0x73, 0x6b, 0xa7, 0xfc, 0xd6, 0x86, 0x7b,
10895
++	0xf9, 0xad, 0xd9, 0x3b, 0x70, 0xa6, 0x4e, 0x42, 0x97, 0xa5, 0xa0, 0x6c, 0x26, 0x5b, 0x72, 0x1d,
10896
++	0xca, 0x61, 0xea, 0x10, 0xea, 0x2b, 0xb0, 0x91, 0x16, 0x66, 0x57, 0x1e, 0x3a, 0x09, 0x21, 0xfb,
10897
++	0x4f, 0x2c, 0x18, 0x12, 0x0e, 0x05, 0xa7, 0xc0, 0xfb, 0xcc, 0x1b, 0x2a, 0xe8, 0x4a, 0xf6, 0x41,
10898
++	0xcd, 0x3a, 0x93, 0xab, 0x7c, 0x5e, 0x49, 0x29, 0x9f, 0x9f, 0xec, 0x46, 0xa4, 0xbb, 0xda, 0xf9,
10899
++	0x6f, 0x15, 0x61, 0xdc, 0x74, 0xa6, 0x38, 0x85, 0x21, 0x58, 0x83, 0xa1, 0x48, 0x78, 0xee, 0x14,
10900
++	0xf2, 0x6d, 0x9f, 0xd3, 0x93, 0x98, 0x18, 0x36, 0x09, 0x5f, 0x1d, 0x49, 0x24, 0xd3, 0x25, 0xa8,
10901
++	0xf8, 0x18, 0x5d, 0x82, 0x7a, 0xf9, 0xb3, 0x94, 0x4e, 0xc2, 0x9f, 0xc5, 0xfe, 0x3a, 0xbb, 0x2c,
10902
++	0xf4, 0xf2, 0x53, 0xe0, 0x23, 0x6e, 0x9a, 0xd7, 0x8a, 0xdd, 0x65, 0x65, 0x89, 0x4e, 0xe5, 0xf0,
10903
++	0x13, 0xbf, 0x64, 0xc1, 0xe5, 0x8c, 0xaf, 0xd2, 0x98, 0x8b, 0xe7, 0x60, 0xd8, 0x69, 0x37, 0x5d,
10904
++	0xb5, 0x97, 0xb5, 0x87, 0xa8, 0x79, 0x51, 0x8e, 0x15, 0x06, 0x5a, 0x84, 0x29, 0xf2, 0xb0, 0xe5,
10905
++	0xf2, 0x97, 0x40, 0xdd, 0xfa, 0xb0, 0xc8, 0x43, 0xc8, 0x2e, 0xa5, 0x81, 0xb8, 0x13, 0x5f, 0xb9,
10906
++	0x43, 0x17, 0x73, 0xdd, 0xa1, 0xff, 0xa1, 0x05, 0x23, 0xa2, 0xdb, 0xa7, 0x30, 0xda, 0xdf, 0x61,
10907
++	0x8e, 0xf6, 0x13, 0x5d, 0x46, 0x3b, 0x67, 0x98, 0xff, 0x4e, 0x41, 0xf5, 0xb7, 0x16, 0x84, 0x71,
10908
++	0x1f, 0x4c, 0xcb, 0xab, 0x30, 0xdc, 0x0a, 0x83, 0x38, 0x68, 0x04, 0x9e, 0xe0, 0x59, 0x2e, 0x25,
10909
++	0xde, 0xfa, 0xbc, 0xfc, 0x48, 0xfb, 0x8d, 0x15, 0x36, 0x1b, 0xbd, 0x20, 0x8c, 0x05, 0x9f, 0x90,
10910
++	0x8c, 0x5e, 0x10, 0xc6, 0x98, 0x41, 0x50, 0x13, 0x20, 0x76, 0xc2, 0x2d, 0x12, 0xd3, 0x32, 0x11,
10911
++	0xf8, 0x23, 0xff, 0xf0, 0x68, 0xc7, 0xae, 0x37, 0xeb, 0xfa, 0x71, 0x14, 0x87, 0xb3, 0x2b, 0x7e,
10912
++	0x7c, 0x37, 0xe4, 0x22, 0x90, 0xe6, 0x7e, 0xaf, 0x68, 0x61, 0x8d, 0xae, 0xf4, 0x91, 0x64, 0x6d,
10913
++	0x0c, 0x98, 0x4f, 0xda, 0x6b, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x15, 0x76, 0x95, 0xb0, 0x01, 0x3a,
10914
++	0x9e, 0x67, 0xfc, 0x37, 0x86, 0xd5, 0xd0, 0xb2, 0xf7, 0xac, 0xaa, 0xee, 0x7f, 0xdf, 0xfd, 0xe4,
10915
++	0xa6, 0x0d, 0xeb, 0x9e, 0x30, 0x89, 0x93, 0x3e, 0xfa, 0xce, 0x0e, 0x4b, 0x87, 0xe7, 0x7b, 0x5c,
10916
++	0x01, 0xc7, 0xb0, 0x6d, 0x60, 0x61, 0xad, 0x59, 0xf8, 0xdf, 0x95, 0x9a, 0x58, 0xe4, 0x5a, 0x58,
10917
++	0x6b, 0x01, 0xc0, 0x09, 0x0e, 0x9a, 0x13, 0x02, 0x74, 0xc9, 0xc8, 0x3e, 0x27, 0x05, 0x68, 0xf9,
10918
++	0xf9, 0x9a, 0x04, 0xfd, 0x02, 0x8c, 0xa8, 0x2c, 0x74, 0x35, 0x9e, 0xcc, 0x4b, 0x84, 0x41, 0x59,
10919
++	0x4a, 0x8a, 0xb1, 0x8e, 0x83, 0xd6, 0x61, 0x22, 0xe2, 0xda, 0x13, 0x15, 0xed, 0x8e, 0x6b, 0xa1,
10920
++	0x3e, 0x29, 0x2d, 0x24, 0xea, 0x26, 0xf8, 0x88, 0x15, 0xf1, 0xa3, 0x43, 0x3a, 0x3a, 0xa6, 0x49,
10921
++	0xa0, 0xd7, 0x61, 0xdc, 0xd3, 0x73, 0xb9, 0xd7, 0x84, 0x92, 0x4a, 0x19, 0x10, 0x1b, 0x99, 0xde,
10922
++	0x6b, 0x38, 0x85, 0x4d, 0x79, 0x1d, 0xbd, 0x44, 0x44, 0x68, 0x74, 0xfc, 0x2d, 0x12, 0x89, 0x1c,
10923
++	0x5a, 0x8c, 0xd7, 0xb9, 0x93, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x57, 0x61, 0x54, 0x7e, 0xbe, 0xe6,
10924
++	0xc6, 0x9b, 0x98, 0xa9, 0x6b, 0x30, 0x6c, 0x60, 0xa2, 0x07, 0x70, 0x4e, 0xfe, 0x5f, 0x0f, 0x9d,
10925
++	0xcd, 0x4d, 0xb7, 0x21, 0xbc, 0xa8, 0xb9, 0xaf, 0xce, 0xbc, 0x74, 0xfe, 0x59, 0xca, 0x42, 0x3a,
10926
++	0x3a, 0xa8, 0x5c, 0x15, 0xa3, 0x96, 0x09, 0x67, 0x93, 0x98, 0x4d, 0x1f, 0xad, 0xc2, 0x99, 0x6d,
10927
++	0xe2, 0x78, 0xf1, 0xf6, 0xe2, 0x36, 0x69, 0xec, 0xc8, 0x4d, 0xc4, 0x9c, 0x83, 0x35, 0xe3, 0xee,
10928
++	0x5b, 0x9d, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x07, 0xa6, 0x5b, 0xed, 0x0d, 0xcf, 0x8d, 0xb6, 0xd7,
10929
++	0x82, 0x98, 0x19, 0x65, 0xa8, 0x24, 0x6e, 0xc2, 0x8b, 0x58, 0x39, 0x46, 0xd7, 0x72, 0xf0, 0x70,
10930
++	0x2e, 0x05, 0xf4, 0x3e, 0x9c, 0x4b, 0x2d, 0x06, 0xe1, 0xd3, 0x38, 0x9e, 0x1f, 0xb6, 0xb4, 0x9e,
10931
++	0x55, 0x41, 0xf8, 0x28, 0x66, 0x81, 0x70, 0x76, 0x13, 0x1f, 0xcc, 0x54, 0xe7, 0x3d, 0x5a, 0x59,
10932
++	0x63, 0xca, 0xd0, 0x97, 0x61, 0x54, 0x5f, 0x45, 0xe2, 0x82, 0xb9, 0x96, 0xcd, 0xb3, 0x68, 0xab,
10933
++	0x8d, 0xb3, 0x74, 0x6a, 0x45, 0xe9, 0x30, 0x6c, 0x50, 0xb4, 0x09, 0x64, 0x7f, 0x1f, 0xba, 0x03,
10934
++	0xc3, 0x0d, 0xcf, 0x25, 0x7e, 0xbc, 0x52, 0xeb, 0x16, 0x74, 0x63, 0x51, 0xe0, 0x88, 0x01, 0x13,
10935
++	0x01, 0x42, 0x79, 0x19, 0x56, 0x14, 0xec, 0xdf, 0x28, 0x40, 0xa5, 0x47, 0x14, 0xdb, 0x94, 0x46,
10936
++	0xd9, 0xea, 0x4b, 0xa3, 0x3c, 0x2f, 0x53, 0xd2, 0xad, 0xa5, 0xc4, 0xec, 0x54, 0xba, 0xb9, 0x44,
10937
++	0xd8, 0x4e, 0xe3, 0xf7, 0x6d, 0xe1, 0xab, 0x2b, 0xa5, 0x4b, 0x3d, 0x6d, 0xcf, 0x8d, 0xc7, 0xa8,
10938
++	0x81, 0xfe, 0x05, 0x91, 0xdc, 0x87, 0x05, 0xfb, 0xeb, 0x05, 0x38, 0xa7, 0x86, 0xf0, 0x2f, 0xee,
10939
++	0xc0, 0xdd, 0xeb, 0x1c, 0xb8, 0x13, 0x78, 0x96, 0xb1, 0xef, 0xc2, 0x20, 0x0f, 0x5a, 0xd2, 0x07,
10940
++	0x03, 0xf4, 0x94, 0x19, 0xe1, 0x4a, 0x5d, 0xd3, 0x46, 0x94, 0xab, 0xbf, 0x62, 0xc1, 0xc4, 0xfa,
10941
++	0x62, 0xad, 0x1e, 0x34, 0x76, 0x48, 0x3c, 0xcf, 0x19, 0x56, 0x2c, 0xf8, 0x1f, 0xeb, 0x11, 0xf9,
10942
++	0x9a, 0x2c, 0x8e, 0xe9, 0x2a, 0x94, 0xb6, 0x83, 0x28, 0x4e, 0xbf, 0xd9, 0xde, 0x0a, 0xa2, 0x18,
10943
++	0x33, 0x88, 0xfd, 0xbb, 0x16, 0x0c, 0xb0, 0x44, 0xaa, 0xbd, 0xb2, 0xfb, 0xf6, 0xf3, 0x5d, 0xe8,
10944
++	0x65, 0x18, 0x24, 0x9b, 0x9b, 0xa4, 0x11, 0x8b, 0x59, 0x95, 0x0e, 0xa5, 0x83, 0x4b, 0xac, 0x94,
10945
++	0x5e, 0xfa, 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0xf4, 0x16, 0x94, 0x63, 0x77, 0x97, 0xcc, 0x37,
10946
++	0x9b, 0xe2, 0xd5, 0xeb, 0x11, 0xfc, 0x77, 0xd7, 0x25, 0x01, 0x9c, 0xd0, 0xb2, 0xbf, 0x5a, 0x00,
10947
++	0x48, 0x5c, 0xef, 0x7b, 0x7d, 0xe2, 0x42, 0xc7, 0x7b, 0xc8, 0xb5, 0x8c, 0xf7, 0x10, 0x94, 0x10,
10948
++	0xcc, 0x78, 0x0c, 0x51, 0xc3, 0x54, 0xec, 0x6b, 0x98, 0x4a, 0xc7, 0x19, 0xa6, 0x45, 0x98, 0x4a,
10949
++	0x42, 0x07, 0x98, 0x71, 0x54, 0x98, 0x90, 0xb2, 0x9e, 0x06, 0xe2, 0x4e, 0x7c, 0x9b, 0xc0, 0x55,
10950
++	0x19, 0xd1, 0x52, 0xde, 0x35, 0xcc, 0xa8, 0xf2, 0x18, 0x89, 0x9e, 0x93, 0x07, 0x9f, 0x42, 0xee,
10951
++	0x83, 0xcf, 0x4f, 0x59, 0x70, 0x36, 0xdd, 0x0e, 0xf3, 0x5e, 0xfb, 0x01, 0x0b, 0xce, 0xb1, 0x67,
10952
++	0x2f, 0xd6, 0x6a, 0xe7, 0x23, 0xdb, 0x4b, 0xd9, 0x21, 0x15, 0xba, 0xf7, 0x38, 0xf1, 0x5c, 0x5e,
10953
++	0xcd, 0x22, 0x8d, 0xb3, 0x5b, 0xb4, 0xbf, 0xdf, 0x02, 0xe1, 0x24, 0xd4, 0xc7, 0xc6, 0x7e, 0x5b,
10954
++	0xa6, 0x42, 0x35, 0x02, 0x78, 0x5f, 0xcd, 0xf7, 0x9a, 0x12, 0x61, 0xbb, 0xd5, 0x45, 0x6a, 0x04,
10955
++	0xeb, 0x36, 0x68, 0xd9, 0x4d, 0x10, 0xd0, 0x2a, 0x61, 0x7a, 0xa2, 0xde, 0xbd, 0xb9, 0x01, 0xd0,
10956
++	0x64, 0xb8, 0x5a, 0x42, 0x44, 0x75, 0x6c, 0x57, 0x15, 0x04, 0x6b, 0x58, 0xf6, 0x8f, 0x14, 0x60,
10957
++	0x44, 0x06, 0x8c, 0x6e, 0xfb, 0xfd, 0x48, 0x73, 0xc7, 0xca, 0x4b, 0xc3, 0x32, 0x88, 0x52, 0xc2,
10958
++	0xb5, 0x44, 0x08, 0x4e, 0x32, 0x88, 0x4a, 0x00, 0x4e, 0x70, 0xd0, 0x33, 0x30, 0x14, 0xb5, 0x37,
10959
++	0x18, 0x7a, 0xca, 0xf5, 0xa5, 0xce, 0x8b, 0xb1, 0x84, 0xa3, 0xcf, 0xc3, 0x24, 0xaf, 0x17, 0x06,
10960
++	0x2d, 0x67, 0x8b, 0x2b, 0x0d, 0x07, 0x94, 0x2f, 0xea, 0xe4, 0x6a, 0x0a, 0x76, 0x74, 0x50, 0x39,
10961
++	0x9b, 0x2e, 0x63, 0xea, 0xe6, 0x0e, 0x2a, 0xf6, 0x97, 0x01, 0x75, 0xc6, 0xc0, 0x46, 0x6f, 0x70,
10962
++	0x03, 0x24, 0x37, 0x24, 0xcd, 0x6e, 0x7a, 0x64, 0xdd, 0x75, 0x52, 0x9a, 0x9f, 0xf3, 0x5a, 0x58,
10963
++	0xd5, 0xb7, 0xff, 0x5a, 0x11, 0x26, 0xd3, 0x8e, 0x74, 0xe8, 0x16, 0x0c, 0xf2, 0x0b, 0x46, 0x90,
10964
++	0xef, 0xf2, 0x4c, 0xa9, 0xb9, 0xdf, 0xb1, 0xad, 0x26, 0xee, 0x28, 0x51, 0x1f, 0xbd, 0x03, 0x23,
10965
++	0xcd, 0xe0, 0x81, 0xff, 0xc0, 0x09, 0x9b, 0xf3, 0xb5, 0x15, 0xb1, 0x2e, 0x33, 0xf9, 0xd4, 0x6a,
10966
++	0x82, 0xa6, 0xbb, 0xf4, 0x31, 0x95, 0x7c, 0x02, 0xc2, 0x3a, 0x39, 0xb4, 0xce, 0xe2, 0xfa, 0x6d,
10967
++	0xba, 0x5b, 0xab, 0x4e, 0xab, 0x9b, 0x35, 0xea, 0xa2, 0x44, 0xd2, 0x28, 0x8f, 0x89, 0xe0, 0x7f,
10968
++	0x1c, 0x80, 0x13, 0x42, 0xe8, 0xbb, 0xe1, 0x4c, 0x94, 0xa3, 0xda, 0xca, 0x4b, 0xb5, 0xd0, 0x4d,
10969
++	0xdb, 0xb3, 0x70, 0x81, 0x4a, 0x10, 0x59, 0x4a, 0xb0, 0xac, 0x66, 0xec, 0xc3, 0x33, 0x60, 0xec,
10970
++	0x46, 0x23, 0xef, 0x8e, 0x75, 0x42, 0x79, 0x77, 0x30, 0x0c, 0x93, 0xdd, 0x56, 0xbc, 0x5f, 0x75,
10971
++	0xc3, 0x6e, 0x89, 0xdb, 0x96, 0x04, 0x4e, 0x27, 0x4d, 0x09, 0xc1, 0x8a, 0x4e, 0x76, 0x72, 0xa4,
10972
++	0xe2, 0x87, 0x98, 0x1c, 0xa9, 0x74, 0x8a, 0xc9, 0x91, 0xd6, 0x60, 0x68, 0xcb, 0x8d, 0x31, 0x69,
10973
++	0x05, 0x82, 0xb5, 0xcb, 0x5c, 0x87, 0x37, 0x39, 0x4a, 0x67, 0x22, 0x0e, 0x01, 0xc0, 0x92, 0x08,
10974
++	0x7a, 0x43, 0xed, 0xc0, 0xc1, 0x7c, 0xc9, 0xa8, 0xf3, 0x3d, 0x2d, 0x73, 0x0f, 0x8a, 0x64, 0x48,
10975
++	0x43, 0x8f, 0x9a, 0x0c, 0x69, 0x59, 0xa6, 0x30, 0x1a, 0xce, 0x37, 0x1d, 0x67, 0x19, 0x8a, 0x7a,
10976
++	0x24, 0x2e, 0x32, 0x92, 0x3d, 0x95, 0x4f, 0x2e, 0xd9, 0xd3, 0xf7, 0x5b, 0x70, 0xae, 0x95, 0x95,
10977
++	0xf7, 0x4c, 0x24, 0x1e, 0x7a, 0xb9, 0xef, 0xc4, 0x6e, 0x46, 0x83, 0x4c, 0x44, 0xce, 0x44, 0xc3,
10978
++	0xd9, 0xcd, 0xd1, 0x81, 0x0e, 0x37, 0x9a, 0x22, 0x5b, 0xd1, 0x53, 0x39, 0x59, 0xa3, 0xba, 0xe4,
10979
++	0x8a, 0x5a, 0xcf, 0xc8, 0x50, 0xf4, 0xf1, 0xbc, 0x0c, 0x45, 0x7d, 0xe7, 0x25, 0x7a, 0x43, 0xe5,
10980
++	0x8b, 0x1a, 0xcb, 0x5f, 0x4a, 0x3c, 0x1b, 0x54, 0xcf, 0x2c, 0x51, 0x6f, 0xa8, 0x2c, 0x51, 0x5d,
10981
++	0xe2, 0x9b, 0xf1, 0x1c, 0x50, 0x3d, 0x73, 0x43, 0x69, 0xf9, 0x9d, 0x26, 0x4e, 0x26, 0xbf, 0x93,
10982
++	0x71, 0xd5, 0x74, 0x49, 0x30, 0xa4, 0xdd, 0x27, 0x9d, 0x09, 0x86, 0x72, 0x2f, 0x1b, 0x9e, 0xcb,
10983
++	0x6a, 0xea, 0x91, 0x72, 0x59, 0xdd, 0xd7, 0x73, 0x43, 0xa1, 0x1e, 0x39, 0x66, 0x28, 0x52, 0x9f,
10984
++	0x19, 0xa1, 0xee, 0xeb, 0x17, 0xe0, 0x99, 0x7c, 0xba, 0xea, 0x9e, 0xeb, 0xa4, 0x9b, 0x79, 0x05,
10985
++	0x76, 0x64, 0x9a, 0x3a, 0x7b, 0x3a, 0x99, 0xa6, 0xce, 0x3d, 0x86, 0x4c, 0x53, 0xe7, 0x4f, 0x2d,
10986
++	0xd3, 0xd4, 0x85, 0x0f, 0x35, 0xd3, 0xd4, 0xf4, 0x63, 0xc8, 0x34, 0xb5, 0x96, 0x64, 0x9a, 0xba,
10987
++	0x98, 0x3f, 0x35, 0x19, 0x76, 0xad, 0x39, 0xf9, 0xa5, 0xee, 0x43, 0xb9, 0x25, 0x23, 0x3e, 0x88,
10988
++	0x40, 0x6c, 0xd9, 0x49, 0x6f, 0xb3, 0xc2, 0x42, 0xf0, 0xf5, 0xaa, 0x40, 0x38, 0x21, 0x45, 0xe9,
10989
++	0x26, 0xf9, 0xa6, 0x9e, 0xe8, 0xa2, 0x0c, 0xcd, 0x52, 0x33, 0x75, 0xc9, 0x32, 0x65, 0xe4, 0x86,
10990
++	0xba, 0x74, 0x72, 0xb9, 0xa1, 0xfe, 0x6a, 0x01, 0xae, 0x74, 0xdf, 0x37, 0x89, 0xee, 0xab, 0x96,
10991
++	0xbc, 0xd5, 0xa4, 0x74, 0x5f, 0x5c, 0x88, 0x4a, 0xb0, 0xfa, 0x0e, 0xb7, 0x73, 0x13, 0xa6, 0x94,
10992
++	0xa1, 0xac, 0xe7, 0x36, 0xf6, 0xb5, 0x24, 0xbb, 0xca, 0x21, 0xb0, 0x9e, 0x46, 0xc0, 0x9d, 0x75,
10993
++	0xd0, 0x3c, 0x4c, 0x18, 0x85, 0x2b, 0x55, 0x21, 0x2c, 0x29, 0x65, 0x5b, 0xdd, 0x04, 0xe3, 0x34,
10994
++	0xbe, 0xfd, 0x73, 0x16, 0x5c, 0xc8, 0x49, 0xc2, 0xd0, 0x77, 0x34, 0x99, 0x4d, 0x98, 0x68, 0x99,
10995
++	0x55, 0x7b, 0x04, 0x9d, 0x32, 0x52, 0x3d, 0xa8, 0xbe, 0xa6, 0x00, 0x38, 0x4d, 0x74, 0xe1, 0xfa,
10996
++	0x6f, 0xfd, 0xfe, 0x95, 0x8f, 0xfd, 0xf6, 0xef, 0x5f, 0xf9, 0xd8, 0xef, 0xfc, 0xfe, 0x95, 0x8f,
10997
++	0xfd, 0xff, 0x87, 0x57, 0xac, 0xdf, 0x3a, 0xbc, 0x62, 0xfd, 0xf6, 0xe1, 0x15, 0xeb, 0x77, 0x0e,
10998
++	0xaf, 0x58, 0xbf, 0x77, 0x78, 0xc5, 0xfa, 0xea, 0x1f, 0x5c, 0xf9, 0xd8, 0xdb, 0x85, 0xbd, 0x17,
10999
++	0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x60, 0x08, 0xf7, 0x9c, 0xf8, 0xe6, 0x00, 0x00,
11000
+ }
11001
+diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go
11002
+index d9a57bd..7bf685f 100644
11003
+--- a/staging/src/k8s.io/api/core/v1/types.go
11004
+@@ -135,9 +135,9 @@ type VolumeSource struct {
11005
+ 	// Quobyte represents a Quobyte mount on the host that shares a pod's lifetime
11006
+ 	// +optional
11007
+ 	Quobyte *QuobyteVolumeSource `json:"quobyte,omitempty" protobuf:"bytes,21,opt,name=quobyte"`
11008
+-	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
11009
++	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
11010
+ 	// +optional
11011
+-	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,22,opt,name=azureDisk"`
11012
++	CascadeDisk *CascadeDiskVolumeSource `json:"vkeDisk,omitempty" protobuf:"bytes,22,opt,name=cascadeDisk"`
11013
+ 	// PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine
11014
+ 	PhotonPersistentDisk *PhotonPersistentDiskVolumeSource `json:"photonPersistentDisk,omitempty" protobuf:"bytes,23,opt,name=photonPersistentDisk"`
11015
+ 	// Items for all in one resources secrets, configmaps, and downward API
11016
+@@ -151,6 +151,9 @@ type VolumeSource struct {
11017
+ 	// StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes.
11018
+ 	// +optional
11019
+ 	StorageOS *StorageOSVolumeSource `json:"storageos,omitempty" protobuf:"bytes,27,opt,name=storageos"`
11020
++	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
11021
++	// +optional
11022
++	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,28,opt,name=azureDisk"`
11023
+ }
11024
+ 
11025
+ // PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace.
11026
+@@ -230,9 +233,9 @@ type PersistentVolumeSource struct {
11027
+ 	// Quobyte represents a Quobyte mount on the host that shares a pod's lifetime
11028
+ 	// +optional
11029
+ 	Quobyte *QuobyteVolumeSource `json:"quobyte,omitempty" protobuf:"bytes,15,opt,name=quobyte"`
11030
+-	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
11031
++	// CascadeDisk represents a Cascade persistent disk attached and mounted on kubelets host machine
11032
+ 	// +optional
11033
+-	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,16,opt,name=azureDisk"`
11034
++	CascadeDisk *CascadeDiskVolumeSource `json:"vkeDisk,omitempty" protobuf:"bytes,16,opt,name=cascadeDisk"`
11035
+ 	// PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine
11036
+ 	PhotonPersistentDisk *PhotonPersistentDiskVolumeSource `json:"photonPersistentDisk,omitempty" protobuf:"bytes,17,opt,name=photonPersistentDisk"`
11037
+ 	// PortworxVolume represents a portworx volume attached and mounted on kubelets host machine
11038
+@@ -251,6 +254,9 @@ type PersistentVolumeSource struct {
11039
+ 	// CSI represents storage that handled by an external CSI driver (Beta feature).
11040
+ 	// +optional
11041
+ 	CSI *CSIPersistentVolumeSource `json:"csi,omitempty" protobuf:"bytes,22,opt,name=csi"`
11042
++	// AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod.
11043
++	// +optional
11044
++	AzureDisk *AzureDiskVolumeSource `json:"azureDisk,omitempty" protobuf:"bytes,23,opt,name=azureDisk"`
11045
+ }
11046
+ 
11047
+ const (
11048
+@@ -1464,6 +1470,16 @@ type StorageOSPersistentVolumeSource struct {
11049
+ 	SecretRef *ObjectReference `json:"secretRef,omitempty" protobuf:"bytes,5,opt,name=secretRef"`
11050
+ }
11051
+ 
11052
++// Represents a Photon Controller persistent disk resource.
11053
++type CascadeDiskVolumeSource struct {
11054
++	// ID that identifies Cascade persistent disk
11055
++	DiskID string `json:"diskID" protobuf:"bytes,1,opt,name=diskID"`
11056
++	// Filesystem type to mount.
11057
++	// Must be a filesystem type supported by the host operating system.
11058
++	// Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified.
11059
++	FSType string `json:"fsType,omitempty" protobuf:"bytes,2,opt,name=fsType"`
11060
++}
11061
++
11062
+ // Adapts a ConfigMap into a volume.
11063
+ //
11064
+ // The contents of the target ConfigMap's Data field will be presented in a
11065
+-- 
11066
+2.10.1
11067
+
0 11068
new file mode 100644
... ...
@@ -0,0 +1,211 @@
0
+Summary:        Kubernetes cluster management
1
+Name:           kubernetes
2
+Version:        1.12.3
3
+Release:        1%{?dist}
4
+License:        ASL 2.0
5
+URL:            https://github.com/kubernetes/kubernetes/archive/v%{version}.tar.gz
6
+Source0:        kubernetes-%{version}.tar.gz
7
+%define sha1    kubernetes-%{version}.tar.gz=504c29cf1b7f9064ab1d7cac476562cde92a3878
8
+Source1:        https://github.com/kubernetes/contrib/archive/contrib-0.7.0.tar.gz
9
+%define sha1    contrib-0.7.0=47a744da3b396f07114e518226b6313ef4b2203c
10
+Patch0:         k8s-1.12-vke.patch
11
+Group:          Development/Tools
12
+Vendor:         VMware, Inc.
13
+Distribution:   Photon
14
+BuildRequires:  go >= 1.10.2
15
+BuildRequires:  rsync
16
+BuildRequires:  which
17
+Requires:       cni
18
+Requires:       ebtables
19
+Requires:       etcd >= 3.0.4
20
+Requires:       ethtool
21
+Requires:       iptables
22
+Requires:       iproute2
23
+Requires(pre):  /usr/sbin/useradd /usr/sbin/groupadd
24
+Requires(postun):/usr/sbin/userdel /usr/sbin/groupdel
25
+Requires:       socat
26
+Requires:       (util-linux or toybox)
27
+Requires:       cri-tools
28
+
29
+%description
30
+Kubernetes is an open source implementation of container cluster management.
31
+
32
+%package        kubeadm
33
+Summary:        kubeadm deployment tool
34
+Group:          Development/Tools
35
+Requires:       %{name} = %{version}
36
+%description    kubeadm
37
+kubeadm is a tool that enables quick and easy deployment of a kubernetes cluster.
38
+
39
+%package	kubectl-extras
40
+Summary:	kubectl binaries for extra platforms
41
+Group:		Development/Tools
42
+%description	kubectl-extras
43
+Contains kubectl binaries for additional platforms.
44
+
45
+%package        pause
46
+Summary:        pause binary
47
+Group:          Development/Tools
48
+%description    pause
49
+A pod setup process that holds a pod's namespace.
50
+
51
+%prep -p exit
52
+%setup -qn %{name}-%{version}
53
+cd ..
54
+tar xf %{SOURCE1} --no-same-owner
55
+sed -i -e 's|127.0.0.1:4001|127.0.0.1:2379|g' contrib-0.7.0/init/systemd/environ/apiserver
56
+cd %{name}-%{version}
57
+%patch0 -p1
58
+
59
+%build
60
+make
61
+pushd build/pause
62
+mkdir -p bin
63
+gcc -Os -Wall -Werror -static -o bin/pause-amd64 pause.c
64
+strip bin/pause-amd64
65
+popd
66
+make WHAT="cmd/kubectl" KUBE_BUILD_PLATFORMS="darwin/amd64 windows/amd64"
67
+
68
+%install
69
+install -vdm644 %{buildroot}/etc/profile.d
70
+install -m 755 -d %{buildroot}%{_bindir}
71
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes
72
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes/darwin/amd64
73
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes/linux/amd64
74
+install -m 755 -d %{buildroot}/opt/vmware/kubernetes/windows/amd64
75
+
76
+binaries=(cloud-controller-manager hyperkube kube-apiserver kube-controller-manager kubelet kube-proxy kube-scheduler kubectl)
77
+for bin in "${binaries[@]}"; do
78
+  echo "+++ INSTALLING ${bin}"
79
+  install -p -m 755 -t %{buildroot}%{_bindir} _output/local/bin/linux/amd64/${bin}
80
+done
81
+install -p -m 755 -t %{buildroot}%{_bindir} build/pause/bin/pause-amd64
82
+
83
+# kubectl-extras
84
+install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/darwin/amd64/ _output/local/bin/darwin/amd64/kubectl
85
+install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/linux/amd64/ _output/local/bin/linux/amd64/kubectl
86
+install -p -m 755 -t %{buildroot}/opt/vmware/kubernetes/windows/amd64/ _output/local/bin/windows/amd64/kubectl.exe
87
+
88
+# kubeadm install
89
+install -vdm644 %{buildroot}/etc/systemd/system/kubelet.service.d
90
+install -p -m 755 -t %{buildroot}%{_bindir} _output/local/bin/linux/amd64/kubeadm
91
+install -p -m 755 -t %{buildroot}/etc/systemd/system build/rpms/kubelet.service
92
+install -p -m 755 -t %{buildroot}/etc/systemd/system/kubelet.service.d build/rpms/10-kubeadm.conf
93
+sed -i '/KUBELET_CGROUP_ARGS=--cgroup-driver=systemd/d' %{buildroot}/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
94
+
95
+cd ..
96
+# install config files
97
+install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}
98
+install -m 644 -t %{buildroot}%{_sysconfdir}/%{name} contrib-0.7.0/init/systemd/environ/*
99
+cat << EOF >> %{buildroot}%{_sysconfdir}/%{name}/kubeconfig
100
+apiVersion: v1
101
+clusters:
102
+- cluster:
103
+    server: http://127.0.0.1:8080
104
+EOF
105
+sed -i '/KUBELET_API_SERVER/c\KUBELET_API_SERVER="--kubeconfig=/etc/kubernetes/kubeconfig"' %{buildroot}%{_sysconfdir}/%{name}/kubelet
106
+
107
+# install service files
108
+install -d -m 0755 %{buildroot}/usr/lib/systemd/system
109
+install -m 0644 -t %{buildroot}/usr/lib/systemd/system contrib-0.7.0/init/systemd/*.service
110
+
111
+# install the place the kubelet defaults to put volumes
112
+install -dm755 %{buildroot}/var/lib/kubelet
113
+install -dm755 %{buildroot}/var/run/kubernetes
114
+
115
+mkdir -p %{buildroot}/%{_lib}/tmpfiles.d
116
+cat << EOF >> %{buildroot}/%{_lib}/tmpfiles.d/kubernetes.conf
117
+d /var/run/kubernetes 0755 kube kube -
118
+EOF
119
+
120
+%check
121
+export GOPATH=%{_builddir}
122
+go get golang.org/x/tools/cmd/cover
123
+make %{?_smp_mflags} check
124
+
125
+%clean
126
+rm -rf %{buildroot}/*
127
+
128
+%pre
129
+if [ $1 -eq 1 ]; then
130
+    # Initial installation.
131
+    getent group kube >/dev/null || groupadd -r kube
132
+    getent passwd kube >/dev/null || useradd -r -g kube -d / -s /sbin/nologin \
133
+            -c "Kubernetes user" kube
134
+fi
135
+
136
+%post
137
+chown -R kube:kube /var/lib/kubelet
138
+chown -R kube:kube /var/run/kubernetes
139
+systemctl daemon-reload
140
+
141
+%post kubeadm
142
+systemctl daemon-reload
143
+systemctl stop kubelet
144
+systemctl enable kubelet
145
+
146
+%preun kubeadm
147
+if [ $1 -eq 0 ]; then
148
+    systemctl stop kubelet
149
+fi
150
+
151
+%postun
152
+if [ $1 -eq 0 ]; then
153
+    # Package deletion
154
+    userdel kube
155
+    groupdel kube
156
+    systemctl daemon-reload
157
+fi
158
+
159
+%postun kubeadm
160
+if [ $1 -eq 0 ]; then
161
+    systemctl daemon-reload
162
+fi
163
+
164
+%files
165
+%defattr(-,root,root)
166
+%{_bindir}/cloud-controller-manager
167
+%{_bindir}/hyperkube
168
+%{_bindir}/kube-apiserver
169
+%{_bindir}/kube-controller-manager
170
+%{_bindir}/kubelet
171
+%{_bindir}/kube-proxy
172
+%{_bindir}/kube-scheduler
173
+%{_bindir}/kubectl
174
+#%{_bindir}/kubefed
175
+%{_lib}/systemd/system/kube-apiserver.service
176
+%{_lib}/systemd/system/kubelet.service
177
+%{_lib}/systemd/system/kube-scheduler.service
178
+%{_lib}/systemd/system/kube-controller-manager.service
179
+%{_lib}/systemd/system/kube-proxy.service
180
+%{_lib}/tmpfiles.d/kubernetes.conf
181
+%dir %{_sysconfdir}/%{name}
182
+%dir /var/lib/kubelet
183
+%dir /var/run/kubernetes
184
+%config(noreplace) %{_sysconfdir}/%{name}/config
185
+%config(noreplace) %{_sysconfdir}/%{name}/apiserver
186
+%config(noreplace) %{_sysconfdir}/%{name}/controller-manager
187
+%config(noreplace) %{_sysconfdir}/%{name}/proxy
188
+%config(noreplace) %{_sysconfdir}/%{name}/kubelet
189
+%config(noreplace) %{_sysconfdir}/%{name}/kubeconfig
190
+%config(noreplace) %{_sysconfdir}/%{name}/scheduler
191
+
192
+%files kubeadm
193
+%defattr(-,root,root)
194
+%{_bindir}/kubeadm
195
+/etc/systemd/system/kubelet.service
196
+/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
197
+
198
+%files pause
199
+%defattr(-,root,root)
200
+%{_bindir}/pause-amd64
201
+
202
+%files kubectl-extras
203
+%defattr(-,root,root)
204
+/opt/vmware/kubernetes/darwin/amd64/kubectl
205
+/opt/vmware/kubernetes/linux/amd64/kubectl
206
+/opt/vmware/kubernetes/windows/amd64/kubectl.exe
207
+
208
+%changelog
209
+*   Tue Jan 22 2019 Sudhir Samrit <ssamrit@vmware.com> 1.12.3-1
210
+-   Add k8s version 1.12.3 and VMware Cloud PKS patch (2801b93)