Add purge option for completely remove a release from tiller

pull/1067/head
Ebrahim Byagowi 9 years ago
parent 3f2bbdebab
commit 1c9b8d7257

@ -209,6 +209,8 @@ message UninstallReleaseRequest {
string name = 1; string name = 1;
// DisableHooks causes the server to skip running any hooks for the uninstall. // DisableHooks causes the server to skip running any hooks for the uninstall.
bool disable_hooks = 2; bool disable_hooks = 2;
// Purge removes the release from the store and make its name free for later use.
bool purge = 3;
} }
// UninstallReleaseResponse represents a successful response to an uninstall request. // UninstallReleaseResponse represents a successful response to an uninstall request.

@ -37,6 +37,7 @@ type deleteCmd struct {
name string name string
dryRun bool dryRun bool
disableHooks bool disableHooks bool
purge bool
out io.Writer out io.Writer
client helm.Interface client helm.Interface
@ -67,6 +68,7 @@ func newDeleteCmd(c helm.Interface, out io.Writer) *cobra.Command {
f := cmd.Flags() f := cmd.Flags()
f.BoolVar(&del.dryRun, "dry-run", false, "simulate a delete") f.BoolVar(&del.dryRun, "dry-run", false, "simulate a delete")
f.BoolVar(&del.disableHooks, "no-hooks", false, "prevent hooks from running during deletion") f.BoolVar(&del.disableHooks, "no-hooks", false, "prevent hooks from running during deletion")
f.BoolVar(&del.purge, "purge", false, "remove the release from the store and make its name free for later use")
return cmd return cmd
} }
@ -75,6 +77,7 @@ func (d *deleteCmd) run() error {
opts := []helm.DeleteOption{ opts := []helm.DeleteOption{
helm.DeleteDryRun(d.dryRun), helm.DeleteDryRun(d.dryRun),
helm.DeleteDisableHooks(d.disableHooks), helm.DeleteDisableHooks(d.disableHooks),
helm.DeletePurge(d.purge),
} }
_, err := d.client.DeleteRelease(d.name, opts...) _, err := d.client.DeleteRelease(d.name, opts...)
return prettyError(err) return prettyError(err)

@ -40,6 +40,13 @@ func TestDelete(t *testing.T) {
expected: "", expected: "",
resp: releaseMock(&releaseOptions{name: "aeneas"}), resp: releaseMock(&releaseOptions{name: "aeneas"}),
}, },
{
name: "purge",
args: []string{"aeneas"},
flags: []string{"--purge"},
expected: "",
resp: releaseMock(&releaseOptions{name: "aeneas"}),
},
{ {
name: "delete without release", name: "delete without release",
args: []string{}, args: []string{},

@ -518,6 +518,13 @@ func (s *releaseServer) UninstallRelease(c ctx.Context, req *services.UninstallR
// TODO: Are there any cases where we want to force a delete even if it's // TODO: Are there any cases where we want to force a delete even if it's
// already marked deleted? // already marked deleted?
if rel.Info.Status.Code == release.Status_DELETED { if rel.Info.Status.Code == release.Status_DELETED {
if req.Purge {
if _, err := s.env.Releases.Delete(rel.Name); err != nil {
log.Printf("uninstall: Failed to purge the release: %s", err)
return nil, err
}
return &services.UninstallReleaseResponse{Release: rel}, nil
}
return nil, fmt.Errorf("the release named %q is already deleted", req.Name) return nil, fmt.Errorf("the release named %q is already deleted", req.Name)
} }
@ -544,8 +551,14 @@ func (s *releaseServer) UninstallRelease(c ctx.Context, req *services.UninstallR
} }
} }
if err := s.env.Releases.Update(rel); err != nil { if !req.Purge {
log.Printf("uninstall: Failed to store updated release: %s", err) if err := s.env.Releases.Update(rel); err != nil {
log.Printf("uninstall: Failed to store updated release: %s", err)
}
} else {
if _, err := s.env.Releases.Delete(rel.Name); err != nil {
log.Printf("uninstall: Failed to purge the release: %s", err)
}
} }
return res, nil return res, nil

@ -438,6 +438,70 @@ func TestUninstallRelease(t *testing.T) {
} }
} }
func TestUninstallPurgeRelease(t *testing.T) {
c := context.Background()
rs := rsFixture()
rs.env.Releases.Create(releaseStub())
req := &services.UninstallReleaseRequest{
Name: "angry-panda",
Purge: true,
}
res, err := rs.UninstallRelease(c, req)
if err != nil {
t.Errorf("Failed uninstall: %s", err)
}
if res.Release.Name != "angry-panda" {
t.Errorf("Expected angry-panda, got %q", res.Release.Name)
}
if res.Release.Info.Status.Code != release.Status_DELETED {
t.Errorf("Expected status code to be DELETED, got %d", res.Release.Info.Status.Code)
}
if res.Release.Hooks[0].LastRun.Seconds == 0 {
t.Error("Expected LastRun to be greater than zero.")
}
if res.Release.Info.Deleted.Seconds <= 0 {
t.Errorf("Expected valid UNIX date, got %d", res.Release.Info.Deleted.Seconds)
}
// Test that after deletion, we get an error that it is already deleted.
if _, err = rs.UninstallRelease(c, req); err == nil {
t.Error("Expected error when deleting already deleted resource.")
} else if err.Error() != "release: not found" {
t.Errorf("Unexpected error message: %q", err)
}
}
func TestUninstallPurgeDeleteRelease(t *testing.T) {
c := context.Background()
rs := rsFixture()
rs.env.Releases.Create(releaseStub())
req := &services.UninstallReleaseRequest{
Name: "angry-panda",
}
_, err := rs.UninstallRelease(c, req)
if err != nil {
t.Errorf("Failed uninstall: %s", err)
}
req2 := &services.UninstallReleaseRequest{
Name: "angry-panda",
Purge: true,
}
_, err2 := rs.UninstallRelease(c, req2)
if err2 != nil {
t.Errorf("Failed uninstall: %s", err2)
}
}
func TestUninstallReleaseNoHooks(t *testing.T) { func TestUninstallReleaseNoHooks(t *testing.T) {
c := context.Background() c := context.Background()
rs := rsFixture() rs := rsFixture()

@ -47,6 +47,8 @@ type options struct {
instReq rls.InstallReleaseRequest instReq rls.InstallReleaseRequest
// release update options are applied directly to the update release request // release update options are applied directly to the update release request
updateReq rls.UpdateReleaseRequest updateReq rls.UpdateReleaseRequest
// release uninstall options are applied directly to the uninstall release request
uninstallReq rls.UninstallReleaseRequest
} }
// Home specifies the location of helm home, (default = "$HOME/.helm"). // Home specifies the location of helm home, (default = "$HOME/.helm").
@ -143,6 +145,13 @@ func DeleteDryRun(dry bool) DeleteOption {
} }
} }
// DeletePurge removes the release from the store and make its name free for later use.
func DeletePurge(purge bool) DeleteOption {
return func(opts *options) {
opts.uninstallReq.Purge = purge
}
}
// 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) {
@ -239,7 +248,11 @@ func (o *options) rpcDeleteRelease(rlsName string, rlc rls.ReleaseServiceClient,
} }
return &rls.UninstallReleaseResponse{Release: r.Release}, nil return &rls.UninstallReleaseResponse{Release: r.Release}, nil
} }
return rlc.UninstallRelease(context.TODO(), &rls.UninstallReleaseRequest{Name: rlsName, DisableHooks: o.disableHooks})
o.uninstallReq.Name = rlsName
o.uninstallReq.DisableHooks = o.disableHooks
return rlc.UninstallRelease(context.TODO(), &o.uninstallReq)
} }
// Executes tiller.UpdateRelease RPC. // Executes tiller.UpdateRelease RPC.

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

Loading…
Cancel
Save