2020-08-23 14:15:53 +00:00
|
|
|
//
|
|
|
|
// Copyright 2020 FoxyUtils ehf. All rights reserved.
|
|
|
|
//
|
|
|
|
// This is a commercial product and requires a license to operate.
|
|
|
|
// A trial license can be obtained at https://unidoc.io
|
|
|
|
//
|
|
|
|
// DO NOT EDIT: generated by unitwist Go source code obfuscator.
|
|
|
|
//
|
|
|
|
// Use of this source code is governed by the UniDoc End User License Agreement
|
|
|
|
// terms that can be accessed at https://unidoc.io/eula/
|
|
|
|
|
|
|
|
// Package license helps manage commercial licenses and check if they are valid for the version of unidoc used.
|
2020-10-12 13:59:12 +00:00
|
|
|
package license ;import (_da "bytes";_fe "compress/gzip";_f "crypto";_bc "crypto/rand";_be "crypto/rsa";_ag "crypto/sha256";_cd "crypto/sha512";_ca "crypto/x509";_gd "encoding/base64";_ef "encoding/hex";_c "encoding/json";_dd "encoding/pem";_d "errors";_e "fmt";_cf "github.com/unidoc/unioffice/common";_a "io";_b "log";_gg "regexp";_gf "strings";_ae "time";);var _bd =false ;func _dff (_aeb string ,_fae string )([]byte ,error ){_cg :="\u000a\u002b\u000a";_fg :="\u000d\u000a\u002b\r\u000a";_ce :=_gf .Index (_fae ,_cg );if _ce ==-1{_ce =_gf .Index (_fae ,_fg );if _ce ==-1{return nil ,_e .Errorf ("\u0069\u006e\u0076al\u0069\u0064\u0020\u0069\u006e\u0070\u0075\u0074\u002c \u0073i\u0067n\u0061t\u0075\u0072\u0065\u0020\u0073\u0065\u0070\u0061\u0072\u0061\u0074\u006f\u0072");};};_cac :=_fae [:_ce ];_fef :=_ce +len (_cg );_dag :=_fae [_fef :];if _cac ==""||_dag ==""{return nil ,_e .Errorf ("\u0069n\u0076\u0061l\u0069\u0064\u0020\u0069n\u0070\u0075\u0074,\u0020\u006d\u0069\u0073\u0073\u0069\u006e\u0067\u0020or\u0069\u0067\u0069n\u0061\u006c \u006f\u0072\u0020\u0073\u0069\u0067n\u0061\u0074u\u0072\u0065");};_af ,_dbf :=_gd .StdEncoding .DecodeString (_cac );if _dbf !=nil {return nil ,_e .Errorf ("\u0069\u006e\u0076\u0061li\u0064\u0020\u0069\u006e\u0070\u0075\u0074\u0020\u006f\u0072\u0069\u0067\u0069\u006ea\u006c");};_gbg ,_dbf :=_gd .StdEncoding .DecodeString (_dag );if _dbf !=nil {return nil ,_e .Errorf ("\u0069\u006e\u0076al\u0069\u0064\u0020\u0069\u006e\u0070\u0075\u0074\u0020\u0073\u0069\u0067\u006e\u0061\u0074\u0075\u0072\u0065");};_eg ,_ :=_dd .Decode ([]byte (_aeb ));if _eg ==nil {return nil ,_e .Errorf ("\u0050\u0075\u0062\u004b\u0065\u0079\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};_ec ,_dbf :=_ca .ParsePKIXPublicKey (_eg .Bytes );if _dbf !=nil {return nil ,_dbf ;};_dbb :=_ec .(*_be .PublicKey );if _dbb ==nil {return nil ,_e .Errorf ("\u0050u\u0062\u004b\u0065\u0079\u0020\u0063\u006f\u006e\u0076\u0065\u0072s\u0069\u006f\u006e\u0020\u0066\u0061\u0069\u006c\u0065\u0064");};_ebe :=_cd .New ();_ebe .Write (_af );_ebee :=_ebe .Sum (nil );_dbf =_be .VerifyPKCS1v15 (_dbb ,_f .SHA512 ,_ebee ,_gbg );if _dbf !=nil {return nil ,_dbf ;};return _af ,nil ;};func (_gae *LicenseKey )isExpired ()bool {return _gae .getExpiryDateToCompare ().After (_gae .ExpiresAt )};
|
|
|
|
|
|
|
|
// LegacyLicense holds the old-style unioffice license information.
|
|
|
|
type LegacyLicense struct{Name string ;Signature string `json:",omitempty"`;Expiration _ae .Time ;LicenseType LegacyLicenseType ;};
|
2020-08-23 14:15:53 +00:00
|
|
|
|
|
|
|
// LicenseKey represents a license key for UniOffice.
|
2020-10-12 13:59:12 +00:00
|
|
|
type LicenseKey struct{LicenseId string `json:"license_id"`;CustomerId string `json:"customer_id"`;CustomerName string `json:"customer_name"`;Tier string `json:"tier"`;CreatedAt _ae .Time `json:"-"`;CreatedAtInt int64 `json:"created_at"`;ExpiresAt _ae .Time `json:"-"`;ExpiresAtInt int64 `json:"expires_at"`;CreatorName string `json:"creator_name"`;CreatorEmail string `json:"creator_email"`;UniPDF bool `json:"unipdf"`;UniOffice bool `json:"unioffice"`;Trial bool `json:"trial"`;};
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-10-12 13:59:12 +00:00
|
|
|
// IsLicensed returns true if the package is licensed.
|
|
|
|
func (_cgg *LicenseKey )IsLicensed ()bool {return _cgg .Tier !=LicenseTierUnlicensed };const (_ee ="\u002d\u002d\u002d--\u0042\u0045\u0047\u0049\u004e\u0020\u0055\u004e\u0049D\u004fC\u0020L\u0049C\u0045\u004e\u0053\u0045\u0020\u004b\u0045\u0059\u002d\u002d\u002d\u002d\u002d";_fa ="\u002d\u002d\u002d\u002d\u002d\u0045\u004e\u0044\u0020\u0055\u004e\u0049\u0044\u004f\u0043 \u004cI\u0043\u0045\u004e\u0053\u0045\u0020\u004b\u0045\u0059\u002d\u002d\u002d\u002d\u002d";);
|
2020-08-31 22:58:25 +00:00
|
|
|
|
2020-10-12 13:59:12 +00:00
|
|
|
// ToString returns a string representing the license information.
|
|
|
|
func (_faa *LicenseKey )ToString ()string {_agg :=_e .Sprintf ("\u004ci\u0063e\u006e\u0073\u0065\u0020\u0049\u0064\u003a\u0020\u0025\u0073\u000a",_faa .LicenseId );_agg +=_e .Sprintf ("\u0043\u0075s\u0074\u006f\u006de\u0072\u0020\u0049\u0064\u003a\u0020\u0025\u0073\u000a",_faa .CustomerId );_agg +=_e .Sprintf ("\u0043u\u0073t\u006f\u006d\u0065\u0072\u0020N\u0061\u006de\u003a\u0020\u0025\u0073\u000a",_faa .CustomerName );_agg +=_e .Sprintf ("\u0054i\u0065\u0072\u003a\u0020\u0025\u0073\n",_faa .Tier );_agg +=_e .Sprintf ("\u0043r\u0065a\u0074\u0065\u0064\u0020\u0041\u0074\u003a\u0020\u0025\u0073\u000a",_cf .UtcTimeFormat (_faa .CreatedAt ));_agg +=_e .Sprintf ("\u0045x\u0070i\u0072\u0065\u0073\u0020\u0041\u0074\u003a\u0020\u0025\u0073\u000a",_cf .UtcTimeFormat (_faa .ExpiresAt ));_agg +=_e .Sprintf ("\u0043\u0072\u0065\u0061\u0074\u006f\u0072\u003a\u0020\u0025\u0073\u0020<\u0025\u0073\u003e\u000a",_faa .CreatorName ,_faa .CreatorEmail );return _agg ;};const (LicenseTierUnlicensed ="\u0075\u006e\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u0064";LicenseTierCommunity ="\u0063o\u006d\u006d\u0075\u006e\u0069\u0074y";LicenseTierIndividual ="\u0069\u006e\u0064\u0069\u0076\u0069\u0064\u0075\u0061\u006c";LicenseTierBusiness ="\u0062\u0075\u0073\u0069\u006e\u0065\u0073\u0073";);const _aeba ="\u0033\u0030\u0035\u0063\u0033\u0030\u0030\u00640\u0036\u0030\u0039\u0032\u0061\u0038\u00364\u0038\u0038\u0036\u0066\u0037\u0030d\u0030\u0031\u0030\u0031\u0030\u00310\u0035\u0030\u0030\u0030\u0033\u0034\u0062\u0030\u0030\u0033\u0030\u00348\u0030\u0032\u0034\u0031\u0030\u0030\u0062\u0038\u0037\u0065\u0061\u0066\u0062\u0036\u0063\u0030\u0037\u0034\u0039\u0039\u0065\u0062\u00397\u0063\u0063\u0039\u0064\u0033\u0035\u0036\u0035\u0065\u0063\u00663\u0031\u0036\u0038\u0031\u0039\u0036\u0033\u0030\u0031\u0039\u0030\u0037c\u0038\u0034\u0031\u0061\u0064\u0064c6\u0036\u0035\u0030\u0038\u0036\u0062\u0062\u0033\u0065\u0064\u0038\u0065\u0062\u0031\u0032\u0064\u0039\u0064\u0061\u0032\u0036\u0063\u0061\u0066\u0061\u0039\u0036\u00345\u0030\u00314\u0036\u0064\u0061\u0038\u0062\u0064\u0030\u0063c\u0066\u0031\u0035\u0035\u0066\u0063a\u0063\u0063\u00368\u0036\u0039\u0035\u0035\u0065\u0066\u0030\u0033\u0030\u0032\u0066\u0061\u0034\u0034\u0061\u0061\u0033\u0065\u0063\u0038\u0039\u0034\u0031\u0037\u0062\u0030\u0032\u0030\u0033\u0030\u0031\u0030\u0030\u0030\u0031";func _fc (_gb string ,_daf []byte )(string ,error ){_bcf ,_ :=_dd .Decode ([]byte (_gb ));if _bcf ==nil {return "",_e .Errorf ("\u0050\u0072\u0069\u0076\u004b\u0065\u0079\u0020\u0066a\u0069\u006c\u0065\u0064");};_gfb ,_df :=_ca .ParsePKCS1PrivateKey (_bcf .Bytes );if _df !=nil {return "",_df ;};_cb :=_cd .New ();_cb .Write (_daf );_cbc :=_cb .Sum (nil );_db ,_df :=_be .SignPKCS1v15 (_bc .Reader ,_gfb ,_f .SHA512 ,_cbc );if _df !=nil {return "",_df ;};_eb :=_gd .StdEncoding .EncodeToString (_daf );_eb +="\u000a\u002b\u000a";_eb +=_gd .StdEncoding .EncodeToString (_db );return _eb ,nil ;};func _eca (_fca string ,_ebb string ,_aec string )(string ,error ){_fb :=_gf .Index (_aec ,_fca );if _fb ==-1{return "",_e .Errorf ("\u0068\u0065a\u0064\u0065\u0072 \u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_ggf :=_gf .Index (_aec ,_ebb );if _ggf ==-1{return "",_e .Errorf ("\u0066\u006fo\u0074\u0065\u0072 \u006e\u006f\u0074\u0020\u0066\u006f\u0075\u006e\u0064");};_fgd :=_fb +len (_fca )+1;return _aec [_fgd :_ggf -1],nil ;};
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-10-12 13:59:12 +00:00
|
|
|
// MakeUnlicensedKey returns an unlicensed key.
|
|
|
|
func MakeUnlicensedKey ()*LicenseKey {_dbfb :=LicenseKey {};_dbfb .CustomerName ="\u0055\u006e\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u0064";_dbfb .Tier =LicenseTierUnlicensed ;_dbfb .CreatedAt =_ae .Now ().UTC ();_dbfb .CreatedAtInt =_dbfb .CreatedAt .Unix ();return &_dbfb ;};var _dbg =_ae .Date (2010,1,1,0,0,0,0,_ae .UTC );
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-10-12 13:59:12 +00:00
|
|
|
// SetLicenseKey sets and validates the license key.
|
|
|
|
func SetLicenseKey (content string ,customerName string )error {if _bd {return nil ;};_cab ,_gde :=_bcc (content );if _gde !=nil {return _gde ;};if _gf .ToLower (_cab .CustomerName )!=_gf .ToLower (customerName ){return _e .Errorf ("\u0063\u0075\u0073\u0074\u006fm\u0065\u0072\u0020\u006e\u0061\u006d\u0065\u0020\u006d\u0069\u0073\u006d\u0061t\u0063\u0068\u002c\u0020\u0065\u0078\u0070\u0065\u0063\u0074\u0065\u0064\u0020\u0027\u0025\u0073\u0027\u002c\u0020\u0062\u0075\u0074\u0020\u0067\u006f\u0074\u0020\u0027\u0025\u0073'",customerName ,_cab .CustomerName );};_gde =_cab .Validate ();if _gde !=nil {return _gde ;};_fcc =&_cab ;return nil ;};var _fcc =MakeUnlicensedKey ();func _bcc (_ecd string )(LicenseKey ,error ){var _bcce LicenseKey ;_faec ,_ga :=_eca (_ee ,_fa ,_ecd );if _ga !=nil {return _bcce ,_ga ;};_ad ,_ga :=_dff (_dc ,_faec );if _ga !=nil {return _bcce ,_ga ;};_ga =_c .Unmarshal (_ad ,&_bcce );if _ga !=nil {return _bcce ,_ga ;};_bcce .CreatedAt =_ae .Unix (_bcce .CreatedAtInt ,0);_bcce .ExpiresAt =_ae .Unix (_bcce .ExpiresAtInt ,0);return _bcce ,nil ;};
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-08-31 22:58:25 +00:00
|
|
|
// TypeToString returns a string representation of the license type.
|
2020-10-12 13:59:12 +00:00
|
|
|
func (_dg *LicenseKey )TypeToString ()string {if _dg .Tier ==LicenseTierUnlicensed {return "\u0055\u006e\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u0064";};if _dg .Tier ==LicenseTierCommunity {return "\u0055\u006e\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u0064";};if _dg .Tier ==LicenseTierIndividual ||_dg .Tier =="\u0069\u006e\u0064i\u0065"{return "\u0043\u006f\u006dm\u0065\u0072\u0063\u0069a\u006c\u0020\u004c\u0069\u0063\u0065\u006es\u0065\u0020\u002d\u0020\u0049\u006e\u0064\u0069\u0076\u0069\u0064\u0075\u0061\u006c";};return "\u0043\u006fm\u006d\u0065\u0072\u0063\u0069\u0061\u006c\u0020\u004c\u0069\u0063\u0065\u006e\u0073\u0065\u0020\u002d\u0020\u0042\u0075\u0073\u0069ne\u0073\u0073";};func init (){_beg ,_fd :=_ef .DecodeString (_aeba );if _fd !=nil {_b .Fatalf ("e\u0072\u0072\u006f\u0072 r\u0065a\u0064\u0069\u006e\u0067\u0020k\u0065\u0079\u003a\u0020\u0025\u0073",_fd );};_dbfc ,_fd :=_ca .ParsePKIXPublicKey (_beg );if _fd !=nil {_b .Fatalf ("e\u0072\u0072\u006f\u0072 r\u0065a\u0064\u0069\u006e\u0067\u0020k\u0065\u0079\u003a\u0020\u0025\u0073",_fd );};_ge =_dbfc .(*_be .PublicKey );};
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-08-31 22:58:25 +00:00
|
|
|
// Validate returns an error if the licenseis invalid, nil otherwise.
|
2020-10-12 13:59:12 +00:00
|
|
|
func (_aa *LicenseKey )Validate ()error {if len (_aa .LicenseId )< 10{return _e .Errorf ("i\u006e\u0076\u0061\u006c\u0069\u0064 \u006c\u0069\u0063\u0065\u006e\u0073\u0065\u003a\u0020L\u0069\u0063\u0065n\u0073e\u0020\u0049\u0064");};if len (_aa .CustomerId )< 10{return _e .Errorf ("\u0069\u006e\u0076\u0061l\u0069\u0064\u0020\u006c\u0069\u0063\u0065\u006e\u0073\u0065:\u0020C\u0075\u0073\u0074\u006f\u006d\u0065\u0072 \u0049\u0064");};if len (_aa .CustomerName )< 1{return _e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u0069c\u0065\u006e\u0073\u0065\u003a\u0020\u0043u\u0073\u0074\u006f\u006d\u0065\u0072\u0020\u004e\u0061\u006d\u0065");};if _dbg .After (_aa .CreatedAt ){return _e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u003a\u0020\u0043\u0072\u0065\u0061\u0074\u0065\u0064 \u0041\u0074\u0020\u0069\u0073 \u0069\u006ev\u0061\u006c\u0069\u0064");};if _aa .CreatedAt .After (_aa .ExpiresAt ){return _e .Errorf ("i\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u003a\u0020\u0043\u0072\u0065\u0061\u0074\u0065\u0064\u0020\u0041\u0074 \u0063a\u006e\u006e\u006f\u0074 \u0062\u0065 \u0047\u0072\u0065\u0061\u0074\u0065\u0072\u0020\u0074\u0068\u0061\u006e\u0020\u0045\u0078\u0070\u0069\u0072\u0065\u0073\u0020\u0041\u0074");};if _aa .isExpired (){return _e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020l\u0069\u0063\u0065ns\u0065\u003a\u0020\u0054\u0068\u0065 \u006c\u0069\u0063\u0065\u006e\u0073\u0065\u0020\u0068\u0061\u0073\u0020\u0061\u006c\u0072e\u0061\u0064\u0079\u0020\u0065\u0078\u0070\u0069r\u0065\u0064");};if len (_aa .CreatorName )< 1{return _e .Errorf ("\u0069\u006ev\u0061\u006c\u0069\u0064\u0020\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u003a\u0020\u0043\u0072\u0065\u0061\u0074\u006f\u0072\u0020na\u006d\u0065");};if len (_aa .CreatorEmail )< 1{return _e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u0069c\u0065\u006e\u0073\u0065\u003a\u0020\u0043r\u0065\u0061\u0074\u006f\u0072\u0020\u0065\u006d\u0061\u0069\u006c");};if !_aa .UniOffice {return _e .Errorf ("\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020\u006c\u0069\u0063\u0065\u006e\u0073\u0065\u003a\u0020\u0054\u0068\u0069s\u0020\u0055\u006e\u0069\u0044\u006f\u0063\u0020\u006be\u0079\u0020\u0069\u0073\u0020\u0069\u006e\u0076\u0061\u006c\u0069\u0064\u0020f\u006f\u0072\u0020\u0055\u006e\u0069O\u0066\u0066\u0069c\u0065\u002e");};return nil ;};
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-08-31 22:58:25 +00:00
|
|
|
// LegacyLicenseType is the type of license
|
2020-10-12 13:59:12 +00:00
|
|
|
type LegacyLicenseType byte ;var _ge *_be .PublicKey ;
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-10-12 13:59:12 +00:00
|
|
|
// SetLegacyLicenseKey installs a legacy license code. License codes issued prior to June 2019.
|
|
|
|
// Will be removed at some point in a future major version.
|
|
|
|
func SetLegacyLicenseKey (s string )error {_cee :=_gg .MustCompile ("\u005c\u0073");s =_cee .ReplaceAllString (s ,"");var _dce _a .Reader ;_dce =_gf .NewReader (s );_dce =_gd .NewDecoder (_gd .RawURLEncoding ,_dce );_dce ,_cfe :=_fe .NewReader (_dce );if _cfe !=nil {return _cfe ;};_ccf :=_c .NewDecoder (_dce );_ebc :=&LegacyLicense {};if _agd :=_ccf .Decode (_ebc );_agd !=nil {return _agd ;};if _dfc :=_ebc .Verify (_ge );_dfc !=nil {return _d .New ("\u006c\u0069\u0063en\u0073\u0065\u0020\u0076\u0061\u006c\u0069\u0064\u0061\u0074\u0069\u006e\u0020\u0065\u0072\u0072\u006f\u0072");};if _ebc .Expiration .Before (_cf .ReleasedAt ){return _d .New ("\u006ci\u0063e\u006e\u0073\u0065\u0020\u0065\u0078\u0070\u0069\u0072\u0065\u0064");};_ba :=_ae .Now ().UTC ();_ega :=LicenseKey {};_ega .CreatedAt =_ba ;_ega .CustomerId ="\u004c\u0065\u0067\u0061\u0063\u0079";_ega .CustomerName =_ebc .Name ;_ega .Tier =LicenseTierBusiness ;_ega .ExpiresAt =_ebc .Expiration ;_ega .CreatorName ="\u0055\u006e\u0069\u0044\u006f\u0063\u0020\u0073\u0075p\u0070\u006f\u0072\u0074";_ega .CreatorEmail ="\u0073\u0075\u0070\u0070\u006f\u0072\u0074\u0040\u0075\u006e\u0069\u0064o\u0063\u002e\u0069\u006f";_ega .UniOffice =true ;_fcc =&_ega ;return nil ;};
|
2020-08-23 14:15:53 +00:00
|
|
|
|
2020-10-12 13:59:12 +00:00
|
|
|
// Verify verifies a license by checking the license content and signature
|
|
|
|
// against a public key.
|
|
|
|
func (_ea LegacyLicense )Verify (pubKey *_be .PublicKey )error {_gfg :=_ea ;_gfg .Signature ="";_efc :=_da .Buffer {};_cdd :=_c .NewEncoder (&_efc );if _bec :=_cdd .Encode (_gfg );_bec !=nil {return _bec ;};_begd ,_cc :=_ef .DecodeString (_ea .Signature );if _cc !=nil {return _cc ;};_fgb :=_ag .Sum256 (_efc .Bytes ());_cc =_be .VerifyPKCS1v15 (pubKey ,_f .SHA256 ,_fgb [:],_begd );return _cc ;};func GetLicenseKey ()*LicenseKey {if _fcc ==nil {return nil ;};_ac :=*_fcc ;return &_ac ;};func (_ege *LicenseKey )getExpiryDateToCompare ()_ae .Time {if _ege .Trial {return _ae .Now ().UTC ();};return _cf .ReleasedAt ;};const _dc ="\u000a\u002d\u002d\u002d\u002d\u002d\u0042\u0045\u0047\u0049\u004e \u0050\u0055\u0042\u004c\u0049\u0043\u0020\u004b\u0045Y\u002d\u002d\u002d\u002d\u002d\u000a\u004d\u0049I\u0042\u0049\u006a\u0041NB\u0067\u006b\u0071\u0068\u006b\u0069G\u0039\u0077\u0030\u0042\u0041\u0051\u0045\u0046A\u0041\u004f\u0043\u0041\u0051\u0038\u0041\u004d\u0049\u0049\u0042\u0043\u0067\u004b\u0043\u0041\u0051\u0045A\u006dF\u0055\u0069\u0079\u0064\u0037\u0062\u0035\u0058\u006a\u0070\u006b\u0050\u0035\u0052\u0061\u0070\u0034\u0077\u000a\u0044\u0063\u0031d\u0079\u007a\u0049\u0051\u0034\u004c\u0065\u006b\u0078\u0072\u0076\u0079\u0074\u006e\u0045\u004d\u0070\u004e\u0055\u0062\u006f\u0036i\u0041\u0037\u0034\u0056\u0038\u0072\u0075\u005a\u004f\u0076\u0072\u0053\u0063\u0073\u0066\u0032\u0051\u0065\u004e9\u002f\u0071r\u0055\u0047\u0038\u0071\u0045\u0062\u0055\u0057\u0064\u006f\u0045\u0059\u0071+\u000a\u006f\u0074\u0046\u004e\u0041\u0046N\u0078\u006c\u0047\u0062\u0078\u0062\u0044\u0048\u0063\u0064\u0047\u0056\u0061\u004d\u0030\u004f\u0058\u0064\u0058g\u0044y\u004c5\u0061\u0049\u0045\u0061\u0067\u004c\u0030\u0063\u0035\u0070\u0077\u006a\u0049\u0064\u0050G\u0049\u006e\u0034\u0036\u0066\u0037\u0038\u0065\u004d\u004a\u002b\u004a\u006b\u0064\u0063\u0070\u0044\n\u0044\u004a\u0061\u0071\u0059\u0058d\u0072\u007a5\u004b\u0065\u0073\u0068\u006aS\u0069\u0049\u0061\u0061\u0037\u006d\u0065\u006e\u0042\u0049\u0041\u0058\u0053\u0034\u0055\u0046\u0078N\u0066H\u0068\u004e\u0030\u0048\u0043\u0059\u005a\u0059\u0071\u0051\u0047\u0037\u0062K+\u0073\u0035\u0072R\u0048\u006f\u006e\u0079\u0064\u004eW\u0045\u0047\u000a\u0048\u0038M\u0079\u0076\u00722\u0070\u0079\u0061\u0032K\u0072\u004d\u0075m\u0066\u006d\u0041\u0078\u0055\u0042\u0036\u0066\u0065\u006e\u0043\u002f4\u004f\u0030\u0057\u00728\u0067\u0066\u0050\u004f\u0055\u0038R\u0069\u0074\u006d\u0062\u0044\u0076\u0051\u0050\u0049\u0052\u0058\u004fL\u0034\u0076\u0054B\u0072\u0042\u0064\u0062a\u0041\u000a9\u006e\u0077\u004e\u0050\u002b\u0069\u002f\u002f\u0032\u0030\u004d\u00542\u0062\u0078\u006d\u0065\u0057\u0042\u002b\u0067\u0070\u0063\u0045\u0068G\u0070\u0058\u005a7\u0033\u0033\u0061\u007a\u0051\u0078\u0072\u0043\u0033\u004a\u0034\u0076\u0033C\u005a\u006d\u0045\u004eS\u0074\u0044\u004b\u002f\u004b\u0044\u0053\u0050\u004b\u0055\u0047\u0066\u00756\u000a\u0066\u0077I\u0044\u0041\u0051\u0041\u0042\u000a\u002d\u002d\u002d\u002d\u002dE\u004e\u0044\u0020\u0050\u0055\u0042\u004c\u0049\u0043 \u004b\u0045Y\u002d\u002d\u002d\u002d\u002d\n";
|