feat(*): add rollback to a release version

closes #1244
reviewable/pr1248/r1
Adam Reese 10 years ago
parent becc12008f
commit f2bcff6ad9

@ -183,7 +183,6 @@ message UpdateReleaseRequest {
hapi.chart.Config values = 3; hapi.chart.Config values = 3;
// dry_run, if true, will run through the release logic, but neither create // dry_run, if true, will run through the release logic, but neither create
bool dry_run = 4; bool dry_run = 4;
// DisableHooks causes the server to skip running any hooks for the upgrade. // DisableHooks causes the server to skip running any hooks for the upgrade.
bool disable_hooks = 5; bool disable_hooks = 5;
} }
@ -200,6 +199,8 @@ message RollbackReleaseRequest {
bool dry_run = 2; bool dry_run = 2;
// DisableHooks causes the server to skip running any hooks for the rollback // DisableHooks causes the server to skip running any hooks for the rollback
bool disable_hooks = 3; bool disable_hooks = 3;
// Version is the version of the release to deploy.
int32 version = 4;
} }
// RollbackReleaseResponse is the response to an update request. // RollbackReleaseResponse is the response to an update request.

@ -17,8 +17,10 @@ limitations under the License.
package main package main
import ( import (
"errors"
"fmt" "fmt"
"io" "io"
"strconv"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -32,6 +34,7 @@ The argument of the rollback command is the name of a release.
type rollbackCmd struct { type rollbackCmd struct {
name string name string
version int32
dryRun bool dryRun bool
disableHooks bool disableHooks bool
out io.Writer out io.Writer
@ -50,8 +53,15 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command {
Long: rollbackDesc, Long: rollbackDesc,
PersistentPreRunE: setupConnection, PersistentPreRunE: setupConnection,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
if err := checkArgsLength(len(args), "release name"); err != nil { switch {
return err case len(args) == 0:
return errors.New("This command needs a release name")
case len(args) > 1:
v, err := strconv.Atoi(args[1])
if err != nil {
return fmt.Errorf("release version must be an int: %s", err)
}
rollback.version = int32(v)
} }
rollback.name = args[0] rollback.name = args[0]
rollback.client = ensureHelmClient(rollback.client) rollback.client = ensureHelmClient(rollback.client)
@ -66,7 +76,12 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command {
} }
func (r *rollbackCmd) run() error { func (r *rollbackCmd) run() error {
_, err := r.client.RollbackRelease(r.name, helm.RollbackDryRun(r.dryRun), helm.RollbackDisableHooks(r.disableHooks)) _, err := r.client.RollbackRelease(
r.name,
helm.RollbackDryRun(r.dryRun),
helm.RollbackDisableHooks(r.disableHooks),
helm.RollbackVersion(r.version),
)
if err != nil { if err != nil {
return prettyError(err) return prettyError(err)
} }

@ -28,8 +28,12 @@ func TestRollbackCmd(t *testing.T) {
tests := []releaseCase{ tests := []releaseCase{
{ {
name: "rollback a release", name: "rollback a release",
args: []string{"funny-honey", "1"},
expected: "Rollback was a success! Happy Helming!",
},
{
name: "rollback a release without version",
args: []string{"funny-honey"}, args: []string{"funny-honey"},
resp: nil,
expected: "Rollback was a success! Happy Helming!", expected: "Rollback was a success! Happy Helming!",
}, },
} }

@ -461,7 +461,17 @@ func (s *releaseServer) prepareRollback(req *services.RollbackReleaseRequest) (*
return nil, nil, err return nil, nil, err
} }
previousRelease, err := s.env.Releases.Get(req.Name, currentRelease.Version-1) v := req.Version
if v == 0 {
v = currentRelease.Version - 1
}
if v < 1 {
return nil, nil, errors.New("cannot rollback to version < 1")
}
log.Printf("rolling back %s to version %d", req.Name, v)
previousRelease, err := s.env.Releases.Get(req.Name, v)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

@ -664,6 +664,27 @@ func TestRollbackReleaseNoHooks(t *testing.T) {
} }
} }
func TestRollbackWithReleaseVersion(t *testing.T) {
c := helm.NewContext()
rs := rsFixture()
rel := releaseStub()
rs.env.Releases.Create(rel)
upgradedRel := upgradeReleaseVersion(rel)
rs.env.Releases.Update(rel)
rs.env.Releases.Create(upgradedRel)
req := &services.RollbackReleaseRequest{
Name: rel.Name,
DisableHooks: true,
Version: 1,
}
_, err := rs.RollbackRelease(c, req)
if err != nil {
t.Fatalf("Failed rollback: %s", err)
}
}
func TestRollbackRelease(t *testing.T) { func TestRollbackRelease(t *testing.T) {
c := helm.NewContext() c := helm.NewContext()
rs := rsFixture() rs := rsFixture()

@ -196,6 +196,13 @@ func RollbackDryRun(dry bool) RollbackOption {
} }
} }
// RollbackVersion sets the version of the release to deploy.
func RollbackVersion(ver int32) RollbackOption {
return func(opts *options) {
opts.rollbackReq.Version = ver
}
}
// UpgradeDisableHooks will disable hooks for an upgrade operation. // UpgradeDisableHooks will disable hooks for an upgrade operation.
func UpgradeDisableHooks(disable bool) UpdateOption { func UpgradeDisableHooks(disable bool) UpdateOption {
return func(opts *options) { return func(opts *options) {
@ -333,7 +340,7 @@ func (o *options) rpcRollbackRelease(rlsName string, rlc rls.ReleaseServiceClien
o.rollbackReq.DryRun = o.dryRun o.rollbackReq.DryRun = o.dryRun
o.rollbackReq.Name = rlsName o.rollbackReq.Name = rlsName
return rlc.RollbackRelease(context.TODO(), &o.rollbackReq) return rlc.RollbackRelease(NewContext(), &o.rollbackReq)
} }
// Executes tiller.GetReleaseStatus RPC. // Executes tiller.GetReleaseStatus RPC.

@ -289,6 +289,8 @@ type RollbackReleaseRequest struct {
DryRun bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` DryRun bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"`
// DisableHooks causes the server to skip running any hooks for the rollback // DisableHooks causes the server to skip running any hooks for the rollback
DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"`
// Version is the version of the release to deploy.
Version int32 `protobuf:"varint,4,opt,name=version" json:"version,omitempty"`
} }
func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} }
@ -807,64 +809,65 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 944 bytes of a gzipped FileDescriptorProto // 951 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0xe3, 0x44, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x6f, 0xe3, 0x44,
0x14, 0xae, 0xf3, 0x9f, 0xd3, 0x1f, 0xd2, 0xb3, 0x69, 0xe3, 0x5a, 0x80, 0x22, 0x23, 0xd8, 0xb0, 0x10, 0xaf, 0xf3, 0x3f, 0xd3, 0x3f, 0xa4, 0x73, 0x69, 0xe3, 0x5a, 0x80, 0x22, 0x23, 0xb8, 0x70,
0xb0, 0x29, 0x84, 0x5b, 0x84, 0xd4, 0xcd, 0x46, 0x6d, 0xd9, 0x92, 0x95, 0x26, 0x14, 0x24, 0x2e, 0x70, 0x29, 0x84, 0x57, 0x84, 0xd4, 0xcb, 0x45, 0x6d, 0xb9, 0x92, 0x93, 0x36, 0x14, 0x24, 0x1e,
0x88, 0xdc, 0x64, 0xb2, 0xf5, 0xae, 0xe3, 0x09, 0x9e, 0x49, 0x45, 0x1f, 0x81, 0x0b, 0x5e, 0x82, 0x88, 0xdc, 0x64, 0x73, 0x35, 0xe7, 0x78, 0x83, 0x77, 0x53, 0xd1, 0x77, 0x5e, 0x78, 0xe0, 0x4b,
0xf7, 0xe0, 0xc9, 0xb8, 0x41, 0x9e, 0xf1, 0xb8, 0x71, 0x62, 0x6f, 0xbd, 0xb9, 0x89, 0x3d, 0x73, 0xf0, 0x3d, 0xf8, 0x64, 0xbc, 0x20, 0xef, 0x7a, 0xdd, 0x38, 0xb1, 0xaf, 0xbe, 0xbc, 0xc4, 0xde,
0x3e, 0x7f, 0xe7, 0x9b, 0xef, 0xcc, 0x9c, 0x09, 0x58, 0xb7, 0xce, 0xc2, 0x3d, 0xe5, 0x34, 0xb8, 0x9d, 0x9f, 0x7f, 0x33, 0xf3, 0x9b, 0x9d, 0xd9, 0x80, 0x75, 0xeb, 0x2c, 0xdc, 0x53, 0x4e, 0x83,
0x73, 0x27, 0x94, 0x9f, 0x0a, 0xd7, 0xf3, 0x68, 0xd0, 0x5d, 0x04, 0x4c, 0x30, 0x6c, 0x86, 0xb1, 0x3b, 0x77, 0x42, 0xf9, 0xa9, 0x70, 0x3d, 0x8f, 0x06, 0xdd, 0x45, 0xc0, 0x04, 0xc3, 0x66, 0x68,
0xae, 0x8e, 0x75, 0x55, 0xcc, 0x3a, 0x96, 0x5f, 0x4c, 0x6e, 0x9d, 0x40, 0xa8, 0x5f, 0x85, 0xb6, 0xeb, 0x6a, 0x5b, 0x57, 0xd9, 0xac, 0x63, 0xf9, 0xc5, 0xe4, 0xd6, 0x09, 0x84, 0xfa, 0x55, 0x68,
0x5a, 0xab, 0xf3, 0xcc, 0x9f, 0xb9, 0x6f, 0xa2, 0x80, 0x4a, 0x11, 0x50, 0x8f, 0x3a, 0x9c, 0xea, 0xab, 0xb5, 0xba, 0xcf, 0xfc, 0x99, 0xfb, 0x26, 0x32, 0x28, 0x17, 0x01, 0xf5, 0xa8, 0xc3, 0xa9,
0x67, 0xe2, 0x23, 0x1d, 0x73, 0xfd, 0x19, 0x8b, 0x02, 0x27, 0x89, 0x00, 0x17, 0x8e, 0x58, 0xf2, 0x7e, 0x26, 0x3e, 0xd2, 0x36, 0xd7, 0x9f, 0xb1, 0xc8, 0x70, 0x92, 0x30, 0x70, 0xe1, 0x88, 0x25,
0x04, 0xdf, 0x1d, 0x0d, 0xb8, 0xcb, 0x7c, 0xfd, 0x54, 0x31, 0xfb, 0x9f, 0x02, 0x3c, 0xb9, 0x72, 0x4f, 0xf0, 0xdd, 0xd1, 0x80, 0xbb, 0xcc, 0xd7, 0x4f, 0x65, 0xb3, 0xff, 0x29, 0xc0, 0x93, 0x2b,
0xb9, 0x20, 0xea, 0x43, 0x4e, 0xe8, 0x1f, 0x4b, 0xca, 0x05, 0x36, 0xa1, 0xec, 0xb9, 0x73, 0x57, 0x97, 0x0b, 0xa2, 0x3e, 0xe4, 0x84, 0xfe, 0xbe, 0xa4, 0x5c, 0x60, 0x13, 0xca, 0x9e, 0x3b, 0x77,
0x98, 0x46, 0xdb, 0xe8, 0x14, 0x89, 0x1a, 0xe0, 0x31, 0x54, 0xd8, 0x6c, 0xc6, 0xa9, 0x30, 0x0b, 0x85, 0x69, 0xb4, 0x8d, 0x4e, 0x91, 0xa8, 0x05, 0x1e, 0x43, 0x85, 0xcd, 0x66, 0x9c, 0x0a, 0xb3,
0x6d, 0xa3, 0x53, 0x27, 0xd1, 0x08, 0x7f, 0x80, 0x2a, 0x67, 0x81, 0x18, 0xdf, 0xdc, 0x9b, 0xc5, 0xd0, 0x36, 0x3a, 0x75, 0x12, 0xad, 0xf0, 0x3b, 0xa8, 0x72, 0x16, 0x88, 0xf1, 0xcd, 0xbd, 0x59,
0xb6, 0xd1, 0x39, 0xe8, 0x7d, 0xde, 0x4d, 0xb3, 0xa2, 0x1b, 0x66, 0x1a, 0xb1, 0x40, 0x74, 0xc3, 0x6c, 0x1b, 0x9d, 0x83, 0xde, 0xa7, 0xdd, 0x34, 0x29, 0xba, 0xa1, 0xa7, 0x11, 0x0b, 0x44, 0x37,
0x9f, 0x17, 0xf7, 0xa4, 0xc2, 0xe5, 0x33, 0xe4, 0x9d, 0xb9, 0x9e, 0xa0, 0x81, 0x59, 0x52, 0xbc, 0xfc, 0x79, 0x71, 0x4f, 0x2a, 0x5c, 0x3e, 0x43, 0xde, 0x99, 0xeb, 0x09, 0x1a, 0x98, 0x25, 0xc5,
0x6a, 0x84, 0xe7, 0x00, 0x92, 0x97, 0x05, 0x53, 0x1a, 0x98, 0x65, 0x49, 0xdd, 0xc9, 0x41, 0xfd, 0xab, 0x56, 0x78, 0x0e, 0x20, 0x79, 0x59, 0x30, 0xa5, 0x81, 0x59, 0x96, 0xd4, 0x9d, 0x1c, 0xd4,
0x3a, 0xc4, 0x93, 0x3a, 0xd7, 0xaf, 0xf8, 0x3d, 0xec, 0x29, 0x4b, 0xc6, 0x13, 0x36, 0xa5, 0xdc, 0xaf, 0x43, 0x3c, 0xa9, 0x73, 0xfd, 0x8a, 0xdf, 0xc2, 0x9e, 0x92, 0x64, 0x3c, 0x61, 0x53, 0xca,
0xac, 0xb4, 0x8b, 0x9d, 0x83, 0xde, 0x89, 0xa2, 0xd2, 0x0e, 0x8f, 0x94, 0x69, 0x7d, 0x36, 0xa5, 0xcd, 0x4a, 0xbb, 0xd8, 0x39, 0xe8, 0x9d, 0x28, 0x2a, 0xad, 0xf0, 0x48, 0x89, 0xd6, 0x67, 0x53,
0x64, 0x57, 0xc1, 0xc3, 0x77, 0x6e, 0xff, 0x0e, 0x35, 0x4d, 0x6f, 0xf7, 0xa0, 0xa2, 0xc4, 0xe3, 0x4a, 0x76, 0x15, 0x3c, 0x7c, 0xe7, 0xf6, 0xaf, 0x50, 0xd3, 0xf4, 0x76, 0x0f, 0x2a, 0x2a, 0x78,
0x2e, 0x54, 0xaf, 0x87, 0xaf, 0x86, 0xaf, 0x7f, 0x1d, 0x36, 0x76, 0xb0, 0x06, 0xa5, 0xe1, 0xd9, 0xdc, 0x85, 0xea, 0xf5, 0xf0, 0xd5, 0xf0, 0xf5, 0xcf, 0xc3, 0xc6, 0x0e, 0xd6, 0xa0, 0x34, 0x3c,
0x4f, 0x83, 0x86, 0x81, 0x87, 0xb0, 0x7f, 0x75, 0x36, 0xfa, 0x79, 0x4c, 0x06, 0x57, 0x83, 0xb3, 0xfb, 0x61, 0xd0, 0x30, 0xf0, 0x10, 0xf6, 0xaf, 0xce, 0x46, 0x3f, 0x8e, 0xc9, 0xe0, 0x6a, 0x70,
0xd1, 0xe0, 0x65, 0xa3, 0x60, 0x7f, 0x0a, 0xf5, 0x58, 0x15, 0x56, 0xa1, 0x78, 0x36, 0xea, 0xab, 0x36, 0x1a, 0xbc, 0x6c, 0x14, 0xec, 0x8f, 0xa1, 0x1e, 0x47, 0x85, 0x55, 0x28, 0x9e, 0x8d, 0xfa,
0x4f, 0x5e, 0x0e, 0x46, 0xfd, 0x86, 0x61, 0xff, 0x65, 0x40, 0x33, 0x59, 0x04, 0xbe, 0x60, 0x3e, 0xea, 0x93, 0x97, 0x83, 0x51, 0xbf, 0x61, 0xd8, 0x7f, 0x19, 0xd0, 0x4c, 0x16, 0x81, 0x2f, 0x98,
0xa7, 0x61, 0x15, 0x26, 0x6c, 0xe9, 0xc7, 0x55, 0x90, 0x03, 0x44, 0x28, 0xf9, 0xf4, 0x4f, 0x5d, 0xcf, 0x69, 0x58, 0x85, 0x09, 0x5b, 0xfa, 0x71, 0x15, 0xe4, 0x02, 0x11, 0x4a, 0x3e, 0xfd, 0x43,
0x03, 0xf9, 0x1e, 0x22, 0x05, 0x13, 0x8e, 0x27, 0xfd, 0x2f, 0x12, 0x35, 0xc0, 0x6f, 0xa1, 0x16, 0xd7, 0x40, 0xbe, 0x87, 0x48, 0xc1, 0x84, 0xe3, 0x49, 0xfd, 0x8b, 0x44, 0x2d, 0xf0, 0x6b, 0xa8,
0x2d, 0x8e, 0x9b, 0xa5, 0x76, 0xb1, 0xb3, 0xdb, 0x3b, 0x4a, 0x2e, 0x39, 0xca, 0x48, 0x62, 0x98, 0x45, 0xc9, 0x71, 0xb3, 0xd4, 0x2e, 0x76, 0x76, 0x7b, 0x47, 0xc9, 0x94, 0x23, 0x8f, 0x24, 0x86,
0x7d, 0x0e, 0xad, 0x73, 0xaa, 0x95, 0x28, 0x47, 0xf4, 0x9e, 0x08, 0xf3, 0x3a, 0x73, 0x2a, 0xc5, 0xd9, 0xe7, 0xd0, 0x3a, 0xa7, 0x3a, 0x12, 0xa5, 0x88, 0x3e, 0x13, 0xa1, 0x5f, 0x67, 0x4e, 0x65,
0x84, 0x79, 0x9d, 0x39, 0x45, 0x13, 0xaa, 0xd1, 0x86, 0x92, 0x72, 0xca, 0x44, 0x0f, 0x6d, 0x01, 0x30, 0xa1, 0x5f, 0x67, 0x4e, 0xd1, 0x84, 0x6a, 0x74, 0xa0, 0x64, 0x38, 0x65, 0xa2, 0x97, 0xb6,
0xe6, 0x26, 0x51, 0xb4, 0xae, 0x34, 0xa6, 0x2f, 0xa0, 0x14, 0x6e, 0x67, 0x49, 0xb3, 0xdb, 0xc3, 0x00, 0x73, 0x93, 0x28, 0xca, 0x2b, 0x8d, 0xe9, 0x33, 0x28, 0x85, 0xc7, 0x59, 0xd2, 0xec, 0xf6,
0xa4, 0xce, 0x4b, 0x7f, 0xc6, 0x88, 0x8c, 0xe3, 0xc7, 0x50, 0x0f, 0xf1, 0x7c, 0xe1, 0x4c, 0xa8, 0x30, 0x19, 0xe7, 0xa5, 0x3f, 0x63, 0x44, 0xda, 0xf1, 0x43, 0xa8, 0x87, 0x78, 0xbe, 0x70, 0x26,
0x5c, 0x6d, 0x9d, 0x3c, 0x4c, 0xd8, 0x17, 0xab, 0x59, 0xfb, 0xcc, 0x17, 0xd4, 0x17, 0xdb, 0xe9, 0x54, 0x66, 0x5b, 0x27, 0x0f, 0x1b, 0xf6, 0xc5, 0xaa, 0xd7, 0x3e, 0xf3, 0x05, 0xf5, 0xc5, 0x76,
0xbf, 0x82, 0x93, 0x14, 0xa6, 0x68, 0x01, 0xa7, 0x50, 0x8d, 0xa4, 0x49, 0xb6, 0x4c, 0x5f, 0x35, 0xf1, 0x5f, 0xc1, 0x49, 0x0a, 0x53, 0x94, 0xc0, 0x29, 0x54, 0xa3, 0xd0, 0x24, 0x5b, 0xa6, 0xae,
0xca, 0xfe, 0xd7, 0x80, 0xe6, 0xf5, 0x62, 0xea, 0x08, 0xaa, 0x43, 0xef, 0x11, 0xf5, 0x14, 0xca, 0x1a, 0x65, 0xff, 0x6b, 0x40, 0xf3, 0x7a, 0x31, 0x75, 0x04, 0xd5, 0xa6, 0x77, 0x04, 0xf5, 0x14,
0xb2, 0x2d, 0x44, 0x5e, 0x1c, 0x2a, 0x6e, 0xd5, 0x3b, 0xfa, 0xe1, 0x2f, 0x51, 0x71, 0x7c, 0x06, 0xca, 0x72, 0x2c, 0x44, 0x5a, 0x1c, 0x2a, 0x6e, 0x35, 0x3b, 0xfa, 0xe1, 0x2f, 0x51, 0x76, 0x7c,
0x95, 0x3b, 0xc7, 0x5b, 0x52, 0x2e, 0x8d, 0x88, 0x5d, 0x8b, 0x90, 0xb2, 0xa7, 0x90, 0x08, 0x81, 0x06, 0x95, 0x3b, 0xc7, 0x5b, 0x52, 0x2e, 0x85, 0x88, 0x55, 0x8b, 0x90, 0x72, 0xa6, 0x90, 0x08,
0x2d, 0xa8, 0x4e, 0x83, 0xfb, 0x71, 0xb0, 0xf4, 0xe5, 0x21, 0xab, 0x91, 0xca, 0x34, 0xb8, 0x27, 0x81, 0x2d, 0xa8, 0x4e, 0x83, 0xfb, 0x71, 0xb0, 0xf4, 0x65, 0x93, 0xd5, 0x48, 0x65, 0x1a, 0xdc,
0x4b, 0x1f, 0x3f, 0x83, 0xfd, 0xa9, 0xcb, 0x9d, 0x1b, 0x8f, 0x8e, 0x6f, 0x19, 0x7b, 0xc7, 0xe5, 0x93, 0xa5, 0x8f, 0x9f, 0xc0, 0xfe, 0xd4, 0xe5, 0xce, 0x8d, 0x47, 0xc7, 0xb7, 0x8c, 0xbd, 0xe5,
0x39, 0xab, 0x91, 0xbd, 0x68, 0xf2, 0x22, 0x9c, 0xb3, 0x2f, 0xe0, 0x68, 0x4d, 0xfe, 0xb6, 0x4e, 0xb2, 0xcf, 0x6a, 0x64, 0x2f, 0xda, 0xbc, 0x08, 0xf7, 0xec, 0x0b, 0x38, 0x5a, 0x0b, 0x7f, 0x5b,
0xbc, 0x85, 0x63, 0xc2, 0x3c, 0xef, 0xc6, 0x99, 0xbc, 0xcb, 0x61, 0xc5, 0x8a, 0xea, 0xc2, 0xfb, 0x25, 0xfe, 0x34, 0xe0, 0x98, 0x30, 0xcf, 0xbb, 0x71, 0x26, 0x6f, 0x73, 0x68, 0xb1, 0x12, 0x76,
0x55, 0x17, 0x53, 0x54, 0xff, 0x08, 0xad, 0x8d, 0x5c, 0xdb, 0xea, 0xfe, 0xcf, 0x80, 0xa3, 0x4b, 0xe1, 0xdd, 0x61, 0x17, 0x37, 0xc3, 0x5e, 0x2d, 0x6f, 0x29, 0x59, 0xde, 0xef, 0xa1, 0xb5, 0x11,
0x9f, 0x0b, 0xc7, 0xf3, 0xd6, 0x74, 0xc7, 0xe5, 0x32, 0x72, 0x97, 0xab, 0xf0, 0x21, 0xe5, 0x2a, 0xc5, 0xb6, 0x29, 0xfd, 0x67, 0xc0, 0xd1, 0xa5, 0xcf, 0x85, 0xe3, 0x79, 0x6b, 0x19, 0xc5, 0x95,
0x26, 0x16, 0xae, 0x5d, 0x2a, 0xad, 0xb8, 0x94, 0xa7, 0x84, 0xc9, 0x83, 0x53, 0x59, 0x3b, 0x38, 0x34, 0x72, 0x57, 0xb2, 0xf0, 0x3e, 0x95, 0x2c, 0x26, 0x24, 0xd1, 0xfa, 0x95, 0x56, 0xf4, 0xcb,
0xf8, 0x09, 0x40, 0x40, 0x97, 0x9c, 0x8e, 0x25, 0x79, 0x55, 0x7e, 0x5f, 0x97, 0x33, 0x43, 0x67, 0x53, 0xdd, 0x64, 0x4f, 0x55, 0xd6, 0x7a, 0x0a, 0x3f, 0x02, 0x08, 0xe8, 0x92, 0xd3, 0xb1, 0x24,
0x4e, 0xed, 0x4b, 0x38, 0x5e, 0x5f, 0xfc, 0xb6, 0x46, 0xde, 0x42, 0xeb, 0xda, 0x77, 0x53, 0x9d, 0xaf, 0xca, 0xef, 0xeb, 0x72, 0x67, 0xe8, 0xcc, 0xa9, 0x7d, 0x09, 0xc7, 0xeb, 0xc9, 0x6f, 0x2b,
0x4c, 0xdb, 0x01, 0x1b, 0x6b, 0x2b, 0xa4, 0xac, 0xad, 0x09, 0xe5, 0xc5, 0x32, 0x78, 0x43, 0x23, 0xe4, 0x2d, 0xb4, 0xae, 0x7d, 0x37, 0x55, 0xc9, 0xb4, 0xb3, 0xb1, 0x91, 0x5b, 0x21, 0x25, 0xb7,
0xaf, 0xd4, 0xc0, 0x7e, 0x05, 0xe6, 0x66, 0xa6, 0x6d, 0x65, 0x3f, 0x81, 0xc3, 0x73, 0x2a, 0x7e, 0x26, 0x94, 0x17, 0xcb, 0xe0, 0x0d, 0x8d, 0xb4, 0x52, 0x0b, 0xfb, 0x15, 0x98, 0x9b, 0x9e, 0xb6,
0x51, 0xdd, 0x21, 0x12, 0x6c, 0x0f, 0x00, 0x57, 0x27, 0x1f, 0xb8, 0xa3, 0xa9, 0x24, 0xb7, 0xbe, 0x0d, 0xfb, 0x09, 0x1c, 0x9e, 0x53, 0xf1, 0x93, 0x3a, 0x59, 0x51, 0xc0, 0xf6, 0x00, 0x70, 0x75,
0x7a, 0x35, 0x5e, 0xa3, 0x7a, 0x7f, 0x57, 0xe1, 0x40, 0x77, 0x4a, 0x75, 0xaf, 0xa1, 0x0b, 0x7b, 0xf3, 0x81, 0x3b, 0xda, 0x4a, 0x72, 0xeb, 0x5b, 0x59, 0xe3, 0x35, 0xaa, 0xf7, 0x77, 0x15, 0x0e,
0xab, 0x57, 0x02, 0x7e, 0x99, 0x7d, 0xed, 0xad, 0xdd, 0xdd, 0xd6, 0xb3, 0x3c, 0x50, 0x25, 0xd5, 0xf4, 0x10, 0x55, 0x57, 0x1e, 0xba, 0xb0, 0xb7, 0x7a, 0x5b, 0xe0, 0xe7, 0xd9, 0x37, 0xe2, 0xda,
0xde, 0xf9, 0xc6, 0x40, 0x0e, 0x8d, 0xf5, 0x4e, 0x8d, 0xcf, 0xd3, 0x39, 0x32, 0xae, 0x06, 0xab, 0xb5, 0x6e, 0x3d, 0xcb, 0x03, 0x55, 0xa1, 0xda, 0x3b, 0x5f, 0x19, 0xc8, 0xa1, 0xb1, 0x3e, 0xc4,
0x9b, 0x17, 0xae, 0xd3, 0xe2, 0x9d, 0xb4, 0x33, 0xd9, 0x5e, 0xf1, 0x51, 0x9a, 0x64, 0x47, 0xb7, 0xf1, 0x79, 0x3a, 0x47, 0xc6, 0xad, 0x61, 0x75, 0xf3, 0xc2, 0xb5, 0x5b, 0xbc, 0x93, 0x72, 0x26,
0x4e, 0x73, 0xe3, 0xe3, 0xbc, 0x6f, 0x61, 0x3f, 0xd1, 0xc8, 0x30, 0xc3, 0xad, 0xb4, 0x66, 0x6d, 0x27, 0x2f, 0x3e, 0x4a, 0x93, 0x1c, 0xf6, 0xd6, 0x69, 0x6e, 0x7c, 0xec, 0xf7, 0x37, 0xd8, 0x4f,
0x7d, 0x95, 0x0b, 0x1b, 0xe7, 0x9a, 0xc3, 0x41, 0xf2, 0xd0, 0x60, 0x06, 0x41, 0x6a, 0x5f, 0xb1, 0xcc, 0x38, 0xcc, 0x50, 0x2b, 0x6d, 0x8e, 0x5b, 0x5f, 0xe4, 0xc2, 0xc6, 0xbe, 0xe6, 0x70, 0x90,
0xbe, 0xce, 0x07, 0x8e, 0xd3, 0x71, 0x68, 0xac, 0x6f, 0xf7, 0xac, 0x3a, 0x66, 0x1c, 0xc0, 0xac, 0x6c, 0x1a, 0xcc, 0x20, 0x48, 0x9d, 0x2b, 0xd6, 0x97, 0xf9, 0xc0, 0xb1, 0x3b, 0x0e, 0x8d, 0xf5,
0x3a, 0x66, 0x9d, 0x22, 0x7b, 0x07, 0x1d, 0x80, 0x87, 0x13, 0x80, 0x4f, 0x33, 0x0b, 0x92, 0x3c, 0xe3, 0x9e, 0x55, 0xc7, 0x8c, 0x06, 0xcc, 0xaa, 0x63, 0x56, 0x17, 0xd9, 0x3b, 0xe8, 0x00, 0x3c,
0x38, 0x56, 0xe7, 0x71, 0x60, 0x9c, 0x62, 0x01, 0x1f, 0xad, 0x75, 0x71, 0xcc, 0xb0, 0x26, 0xfd, 0x74, 0x00, 0x3e, 0xcd, 0x2c, 0x48, 0xb2, 0x71, 0xac, 0xce, 0xe3, 0xc0, 0xd8, 0xc5, 0x02, 0x3e,
0x62, 0xb1, 0x9e, 0xe7, 0x44, 0xeb, 0x8c, 0x2f, 0xe0, 0xb7, 0x9a, 0x06, 0xdf, 0x54, 0xe4, 0x1f, 0x58, 0x9b, 0xe2, 0x98, 0x21, 0x4d, 0xfa, 0x95, 0x63, 0x3d, 0xcf, 0x89, 0xd6, 0x1e, 0x5f, 0xc0,
0xe5, 0xef, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x37, 0x7c, 0x73, 0xf9, 0x0b, 0x00, 0x00, 0x2f, 0x35, 0x0d, 0xbe, 0xa9, 0xc8, 0xff, 0xd0, 0xdf, 0xfc, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x76,
0x9b, 0x44, 0xa7, 0x14, 0x0c, 0x00, 0x00,
} }

Loading…
Cancel
Save