From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 880F043C30 for ; Sat, 22 Oct 2022 10:34:44 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 09D7868BEAA; Sat, 22 Oct 2022 13:34:25 +0300 (EEST) Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D93D968BCA8 for ; Sat, 22 Oct 2022 13:34:16 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 7EEF12404F7 for ; Sat, 22 Oct 2022 12:34:16 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id fjEg_3V3SuA0 for ; Sat, 22 Oct 2022 12:34:14 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 37A6C2404E4 for ; Sat, 22 Oct 2022 12:34:13 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 1BA1D3A0212 for ; Sat, 22 Oct 2022 12:34:04 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 22 Oct 2022 12:32:54 +0200 Message-Id: <20221022103257.15463-1-anton@khirnov.net> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 1/4] lavc: add standalone cached bitstream reader X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: RnJvbTogQWxleGFuZHJhIEjDoWprb3bDoSA8YWxleGFuZHJhLmtoaXJub3ZhQGdtYWlsLmNvbT4K ClRoZSBjYWNoZWQgYml0c3RyZWFtIHJlYWRlciB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEFs ZXhhbmRyYSBIw6Fqa292w6EKZm9yIExpYmF2LCB3aXRoIHNpZ25pZmljYW50IGlucHV0IGZyb20g S29zdHlhIFNoaXNoa292IGFuZCBMdWNhIEJhcmJhdG8uCkl0IHdhcyB0aGVuIGNvbW1pdHRlZCB0 byBGRm1wZWcgaW4gY2EwNzliMDk1NDksIGJ5IG1lcmdpbmcgaXQgd2l0aCB0aGUKaW1wbGVtZW50 YXRpb24gb2YgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHJlYWRlci4KClRoaXMgbWVyZ2UgbWFrZXMg dGhlIGNvZGUgb2YgZ2V0X2JpdHMuaCBzaWduaWZpY2FudGx5IGhhcmRlciB0byByZWFkLApzaW5j ZSBpdCBub3cgY29udGFpbnMgdHdvIGRpZmZlcmVudCBiaXRzdHJlYW0gcmVhZGVycyBpbnRlcmxl YXZlZCB3aXRoCiAjaWZkZWZzLiBBZGRpdGlvbmFsbHksIHRoZSBjb2RlIHdhcyBjb21taXR0ZWQg d2l0aG91dCBwcm9wZXIgYXV0aG9yc2hpcAphdHRyaWJ1dGlvbi4KClRoaXMgY29tbWl0IHJlLWFk ZHMgdGhlIGNhY2hlZCBiaXRzdHJlYW0gcmVhZGVyIGFzIGEgc3RhbmRhbG9uZSBoZWFkZXIsCmFz IGl0IHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZC4gSXQgd2lsbCBiZSBtYWRlIHVzZWZ1bCBpbiBm b2xsb3dpbmcKY29tbWl0cy4KCkludGVncmF0aW9uIGJ5IEFudG9uIEtoaXJub3YuCgpTaWduZWQt b2ZmLWJ5OiBBbnRvbiBLaGlybm92IDxhbnRvbkBraGlybm92Lm5ldD4KLS0tCiBsaWJhdmNvZGVj L2JpdHN0cmVhbS5oIHwgNTI5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCiAxIGZpbGUgY2hhbmdlZCwgNTI5IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBsaWJhdmNvZGVjL2JpdHN0cmVhbS5oCgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9iaXRzdHJl YW0uaCBiL2xpYmF2Y29kZWMvYml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uNmZkMzIxZGJhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYml0 c3RyZWFtLmgKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxl eGFuZHJhIEjDoWprb3bDoQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAq CisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNz ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwg d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r bGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLwor CisvKioKKyAqIEBmaWxlCisgKiBiaXRzdHJlYW0gcmVhZGVyIEFQSSBoZWFkZXIuCisgKi8KKwor I2lmbmRlZiBBVkNPREVDX0JJVFNUUkVBTV9ICisjZGVmaW5lIEFWQ09ERUNfQklUU1RSRUFNX0gK KworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRl ICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisj aW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9s b2cuaCIKKworI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJ2bGMuaCIKKworI2lmbmRl ZiBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUgorI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFN X1JFQURFUiAhQ09ORklHX1NBRkVfQklUU1RSRUFNX1JFQURFUgorI2VuZGlmCisKK3R5cGVkZWYg c3RydWN0IEJpdHN0cmVhbUNvbnRleHQgeworICAgIHVpbnQ2NF90IGJpdHM7ICAgICAgIC8vIHN0 b3JlcyBiaXRzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCisgICAgY29uc3QgdWludDhfdCAqYnVmZmVy LCAqYnVmZmVyX2VuZDsKKyAgICBjb25zdCB1aW50OF90ICpwdHI7ICAvLyBwb2ludGVyIHRvIHRo ZSBwb3NpdGlvbiBpbnNpZGUgYSBidWZmZXIKKyAgICB1bnNpZ25lZCBiaXRzX3ZhbGlkOyAvLyBu dW1iZXIgb2YgYml0cyBsZWZ0IGluIGJpdHMgZmllbGQKKyAgICB1bnNpZ25lZCBzaXplX2luX2Jp dHM7Cit9IEJpdHN0cmVhbUNvbnRleHQ7CisKKy8qKgorICogQHJldHVybgorICogLSAwIG9uIHN1 Y2Nlc3NmdWwgcmVmaWxsCisgKiAtIGEgbmVnYXRpdmUgbnVtYmVyIHdoZW4gYml0c3RyZWFtIGVu ZCBpcyBoaXQKKyAqCisgKiBBbHdheXMgc3VjY2VlZHMgd2hlbiBVTkNIRUNLRURfQklUU1RSRUFN X1JFQURFUiBpcyBlbmFibGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBiaXRzX3ByaXZfcmVm aWxsXzY0KEJpdHN0cmVhbUNvbnRleHQgKmJjKQoreworI2lmICFVTkNIRUNLRURfQklUU1RSRUFN X1JFQURFUgorICAgIGlmIChiYy0+cHRyID49IGJjLT5idWZmZXJfZW5kKQorICAgICAgICByZXR1 cm4gLTE7CisjZW5kaWYKKworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyAgICBiYy0+Yml0 cyAgICAgICA9IEFWX1JMNjQoYmMtPnB0cik7CisjZWxzZQorICAgIGJjLT5iaXRzICAgICAgID0g QVZfUkI2NChiYy0+cHRyKTsKKyNlbmRpZgorICAgIGJjLT5wdHIgICAgICAgKz0gODsKKyAgICBi Yy0+Yml0c192YWxpZCA9IDY0OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogQHJldHVy bgorICogLSAwIG9uIHN1Y2Nlc3NmdWwgcmVmaWxsCisgKiAtIGEgbmVnYXRpdmUgbnVtYmVyIHdo ZW4gYml0c3RyZWFtIGVuZCBpcyBoaXQKKyAqCisgKiBBbHdheXMgc3VjY2VlZHMgd2hlbiBVTkNI RUNLRURfQklUU1RSRUFNX1JFQURFUiBpcyBlbmFibGVkLgorICovCitzdGF0aWMgaW5saW5lIGlu dCBiaXRzX3ByaXZfcmVmaWxsXzMyKEJpdHN0cmVhbUNvbnRleHQgKmJjKQoreworI2lmICFVTkNI RUNLRURfQklUU1RSRUFNX1JFQURFUgorICAgIGlmIChiYy0+cHRyID49IGJjLT5idWZmZXJfZW5k KQorICAgICAgICByZXR1cm4gLTE7CisjZW5kaWYKKworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJf TEUKKyAgICBiYy0+Yml0cyAgICAgIHw9ICh1aW50NjRfdClBVl9STDMyKGJjLT5wdHIpIDw8IGJj LT5iaXRzX3ZhbGlkOworI2Vsc2UKKyAgICBiYy0+Yml0cyAgICAgIHw9ICh1aW50NjRfdClBVl9S QjMyKGJjLT5wdHIpIDw8ICgzMiAtIGJjLT5iaXRzX3ZhbGlkKTsKKyNlbmRpZgorICAgIGJjLT5w dHIgICAgICAgICs9IDQ7CisgICAgYmMtPmJpdHNfdmFsaWQgKz0gMzI7CisKKyAgICByZXR1cm4g MDsKK30KKworLyoqCisgKiBJbml0aWFsaXplIEJpdHN0cmVhbUNvbnRleHQuCisgKiBAcGFyYW0g YnVmZmVyIGJpdHN0cmVhbSBidWZmZXIsIG11c3QgYmUgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdf U0laRSBieXRlcworICogICAgICAgIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgcmVhZCBiaXRzIGJl Y2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtCisgKiAgICAgICAgcmVhZGVycyByZWFkIDMy IG9yIDY0IGJpdHMgYXQgb25jZSBhbmQgY291bGQgcmVhZCBvdmVyIHRoZSBlbmQKKyAqIEBwYXJh bSBiaXRfc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJpdHMKKyAqIEByZXR1cm4gMCBv biBzdWNjZXNzLCBBVkVSUk9SX0lOVkFMSUREQVRBIGlmIHRoZSBidWZmZXJfc2l6ZSB3b3VsZCBv dmVyZmxvdy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYml0c19pbml0KEJpdHN0cmVhbUNvbnRl eHQgKmJjLCBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdW5zaWduZWQgaW50IGJpdF9zaXplKQoreworICAgIHVuc2lnbmVkIGludCBidWZmZXJfc2l6 ZTsKKworICAgIGlmIChiaXRfc2l6ZSA+IElOVF9NQVggLSA3IHx8ICFidWZmZXIpIHsKKyAgICAg ICAgYmMtPmJ1ZmZlciAgICAgPSBOVUxMOworICAgICAgICBiYy0+cHRyICAgICAgICA9IE5VTEw7 CisgICAgICAgIGJjLT5iaXRzX3ZhbGlkID0gMDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5W QUxJRERBVEE7CisgICAgfQorCisgICAgYnVmZmVyX3NpemUgPSAoYml0X3NpemUgKyA3KSA+PiAz OworCisgICAgYmMtPmJ1ZmZlciAgICAgICA9IGJ1ZmZlcjsKKyAgICBiYy0+YnVmZmVyX2VuZCAg ID0gYnVmZmVyICsgYnVmZmVyX3NpemU7CisgICAgYmMtPnB0ciAgICAgICAgICA9IGJjLT5idWZm ZXI7CisgICAgYmMtPnNpemVfaW5fYml0cyA9IGJpdF9zaXplOworICAgIGJjLT5iaXRzX3ZhbGlk ICAgPSAwOworICAgIGJjLT5iaXRzICAgICAgICAgPSAwOworCisgICAgYml0c19wcml2X3JlZmls bF82NChiYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBJbml0aWFsaXplIEJpdHN0 cmVhbUNvbnRleHQuCisgKiBAcGFyYW0gYnVmZmVyIGJpdHN0cmVhbSBidWZmZXIsIG11c3QgYmUg QVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBieXRlcworICogICAgICAgIGxhcmdlciB0aGFu IHRoZSBhY3R1YWwgcmVhZCBiaXRzIGJlY2F1c2Ugc29tZSBvcHRpbWl6ZWQgYml0c3RyZWFtCisg KiAgICAgICAgcmVhZGVycyByZWFkIDMyIG9yIDY0IGJpdHMgYXQgb25jZSBhbmQgY291bGQgcmVh ZCBvdmVyIHRoZSBlbmQKKyAqIEBwYXJhbSBieXRlX3NpemUgdGhlIHNpemUgb2YgdGhlIGJ1ZmZl ciBpbiBieXRlcworICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIEFWRVJST1JfSU5WQUxJRERBVEEg aWYgdGhlIGJ1ZmZlcl9zaXplIHdvdWxkIG92ZXJmbG93CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50 IGJpdHNfaW5pdDgoQml0c3RyZWFtQ29udGV4dCAqYmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVfc2l6ZSkKK3sK KyAgICBpZiAoYnl0ZV9zaXplID4gSU5UX01BWCAvIDgpCisgICAgICAgIHJldHVybiBBVkVSUk9S X0lOVkFMSUREQVRBOworICAgIHJldHVybiBiaXRzX2luaXQoYmMsIGJ1ZmZlciwgYnl0ZV9zaXpl ICogOCk7Cit9CisKKy8qKgorICogUmV0dXJuIG51bWJlciBvZiBiaXRzIGFscmVhZHkgcmVhZC4K KyAqLworc3RhdGljIGlubGluZSBpbnQgYml0c190ZWxsKGNvbnN0IEJpdHN0cmVhbUNvbnRleHQg KmJjKQoreworICAgIHJldHVybiAoYmMtPnB0ciAtIGJjLT5idWZmZXIpICogOCAtIGJjLT5iaXRz X3ZhbGlkOworfQorCisvKioKKyAqIFJldHVybiBidWZmZXIgc2l6ZSBpbiBiaXRzLgorICovCitz dGF0aWMgaW5saW5lIGludCBiaXRzX3NpemUoY29uc3QgQml0c3RyZWFtQ29udGV4dCAqYmMpCit7 CisgICAgcmV0dXJuIGJjLT5zaXplX2luX2JpdHM7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBu dW1iZXIgb2YgdGhlIGJpdHMgbGVmdCBpbiBhIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSBp bnQgYml0c19sZWZ0KGNvbnN0IEJpdHN0cmVhbUNvbnRleHQgKmJjKQoreworICAgIHJldHVybiAo YmMtPmJ1ZmZlciAtIGJjLT5wdHIpICogOCArIGJjLT5zaXplX2luX2JpdHMgKyBiYy0+Yml0c192 YWxpZDsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBiaXRzX3ByaXZfdmFsX3Nob3coQml0 c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQoreworICAgIGF2X2Fzc2VydDIobiA+ IDAgJiYgbiA8PSA2NCk7CisKKyNpZmRlZiBCSVRTVFJFQU1fUkVBREVSX0xFCisgICAgcmV0dXJu IGJjLT5iaXRzICYgKFVJTlQ2NF9NQVggPj4gKDY0IC0gbikpOworI2Vsc2UKKyAgICByZXR1cm4g YmMtPmJpdHMgPj4gKDY0IC0gbik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJp dHNfcHJpdl9za2lwX3JlbWFpbmluZyhCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50 IG4pCit7CisjaWZkZWYgQklUU1RSRUFNX1JFQURFUl9MRQorICAgIGJjLT5iaXRzID4+PSBuOwor I2Vsc2UKKyAgICBiYy0+Yml0cyA8PD0gbjsKKyNlbmRpZgorICAgIGJjLT5iaXRzX3ZhbGlkIC09 IG47Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgYml0c19wcml2X3ZhbF9nZXQoQml0c3Ry ZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQoreworICAgIHVpbnQ2NF90IHJldDsKKwor ICAgIGF2X2Fzc2VydDIobiA+IDAgJiYgbiA8IDY0KTsKKworICAgIHJldCA9IGJpdHNfcHJpdl92 YWxfc2hvdyhiYywgbik7CisgICAgYml0c19wcml2X3NraXBfcmVtYWluaW5nKGJjLCBuKTsKKwor ICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUmV0dXJuIG9uZSBiaXQgZnJvbSB0aGUgYnVm ZmVyLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiaXRzX3JlYWRfYml0KEJpdHN0 cmVhbUNvbnRleHQgKmJjKQoreworICAgIGlmICghYmMtPmJpdHNfdmFsaWQgJiYgYml0c19wcml2 X3JlZmlsbF82NChiYykgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBiaXRz X3ByaXZfdmFsX2dldChiYywgMSk7Cit9CisKKy8qKgorICogUmV0dXJuIG4gYml0cyBmcm9tIHRo ZSBidWZmZXIsIG4gaGFzIHRvIGJlIGluIHRoZSAxLTMyIHJhbmdlLgorICogTWF5IGJlIGZhc3Rl ciB0aGFuIGJpdHNfcmVhZCgpIHdoZW4gbiBpcyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQg YW5kIGlzCisgKiBrbm93biB0byBiZSBub24temVybzsKKyAqLworc3RhdGljIGlubGluZSB1aW50 MzJfdCBiaXRzX3JlYWRfbnooQml0c3RyZWFtQ29udGV4dCAqYmMsIHVuc2lnbmVkIGludCBuKQor eworICAgIGF2X2Fzc2VydDIobiA+IDAgJiYgbiA8PSAzMik7CisKKyAgICBpZiAobiA+IGJjLT5i aXRzX3ZhbGlkKSB7CisgICAgICAgIGlmIChiaXRzX3ByaXZfcmVmaWxsXzMyKGJjKSA8IDApCisg ICAgICAgICAgICBiYy0+Yml0c192YWxpZCA9IG47CisgICAgfQorCisgICAgcmV0dXJuIGJpdHNf cHJpdl92YWxfZ2V0KGJjLCBuKTsKK30KKworLyoqCisgKiBSZXR1cm4gbiBiaXRzIGZyb20gdGhl IGJ1ZmZlciwgbiBoYXMgdG8gYmUgaW4gdGhlIDAtMzIgIHJhbmdlLgorICovCitzdGF0aWMgaW5s aW5lIHVpbnQzMl90IGJpdHNfcmVhZChCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50 IG4pCit7CisgICAgYXZfYXNzZXJ0MihuIDw9IDMyKTsKKworICAgIGlmICghbikKKyAgICAgICAg cmV0dXJuIDA7CisKKyAgICByZXR1cm4gYml0c19yZWFkX256KGJjLCBuKTsKK30KKworLyoqCisg KiBSZXR1cm4gbiBiaXRzIGZyb20gdGhlIGJ1ZmZlciwgbiBoYXMgdG8gYmUgaW4gdGhlIDAtNjMg cmFuZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgYml0c19yZWFkXzYzKEJpdHN0cmVh bUNvbnRleHQgKmJjLCB1bnNpZ25lZCBpbnQgbikKK3sKKyAgICB1aW50NjRfdCByZXQgPSAwOwor ICAgIHVuc2lnbmVkIGxlZnQgPSAwOworCisgICAgYXZfYXNzZXJ0MihuIDw9IDYzKTsKKworICAg IGlmICghbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAobiA+IGJjLT5iaXRzX3ZhbGlk KSB7CisgICAgICAgIGxlZnQgPSBiYy0+Yml0c192YWxpZDsKKyAgICAgICAgbiAgIC09IGxlZnQ7 CisKKyAgICAgICAgaWYgKGxlZnQpCisgICAgICAgICAgICByZXQgPSBiaXRzX3ByaXZfdmFsX2dl dChiYywgbGVmdCk7CisKKyAgICAgICAgaWYgKGJpdHNfcHJpdl9yZWZpbGxfNjQoYmMpIDwgMCkK KyAgICAgICAgICAgIGJjLT5iaXRzX3ZhbGlkID0gbjsKKworICAgIH0KKworI2lmZGVmIEJJVFNU UkVBTV9SRUFERVJfTEUKKyAgICByZXQgPSBiaXRzX3ByaXZfdmFsX2dldChiYywgbikgPDwgbGVm dCB8IHJldDsKKyNlbHNlCisgICAgcmV0ID0gYml0c19wcml2X3ZhbF9nZXQoYmMsIG4pIHwgcmV0 IDw8IG47CisjZW5kaWYKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUmV0dXJuIG4g Yml0cyBmcm9tIHRoZSBidWZmZXIsIG4gaGFzIHRvIGJlIGluIHRoZSAwLTY0IHJhbmdlLgorICov CitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGJpdHNfcmVhZF82NChCaXRzdHJlYW1Db250ZXh0ICpi YywgdW5zaWduZWQgaW50IG4pCit7CisgICAgYXZfYXNzZXJ0MihuIDw9IDY0KTsKKworICAgIGlm IChuID09IDY0KSB7CisgICAgICAgIHVpbnQ2NF90IHJldCA9IGJpdHNfcmVhZF82MyhiYywgNjMp OworI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKKyAgICAgICAgcmV0dXJuIHJldCB8ICgodWlu dDY0X3QpYml0c19yZWFkX2JpdChiYykgPDwgNjMpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIChy ZXQgPDwgMSkgfCAodWludDY0X3QpYml0c19yZWFkX2JpdChiYyk7CisjZW5kaWYKKyAgICB9Cisg ICAgcmV0dXJuIGJpdHNfcmVhZF82MyhiYywgbik7Cit9CisKKy8qKgorICogUmV0dXJuIG4gYml0 cyBmcm9tIHRoZSBidWZmZXIgYXMgYSBzaWduZWQgaW50ZWdlci4KKyAqIG4gaGFzIHRvIGJlIGlu IHRoZSAwLTMyIHJhbmdlLgorICovCitzdGF0aWMgaW5saW5lIGludDMyX3QgYml0c19yZWFkX3Np Z25lZChCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50IG4pCit7CisgICAgcmV0dXJu IHNpZ25fZXh0ZW5kKGJpdHNfcmVhZChiYywgbiksIG4pOworfQorCisvKioKKyAqIFJldHVybiBu IGJpdHMgZnJvbSB0aGUgYnVmZmVyIGJ1dCBkbyBub3QgY2hhbmdlIHRoZSBidWZmZXIgc3RhdGUu CisgKiBuIGhhcyB0byBiZSBpbiB0aGUgMS0zMiByYW5nZS4gTWF5CisgKi8KK3N0YXRpYyBpbmxp bmUgdWludDMyX3QgYml0c19wZWVrX256KEJpdHN0cmVhbUNvbnRleHQgKmJjLCB1bnNpZ25lZCBp bnQgbikKK3sKKyAgICBhdl9hc3NlcnQyKG4gPiAwICYmIG4gPD0gMzIpOworCisgICAgaWYgKG4g PiBiYy0+Yml0c192YWxpZCkKKyAgICAgICAgYml0c19wcml2X3JlZmlsbF8zMihiYyk7CisKKyAg ICByZXR1cm4gYml0c19wcml2X3ZhbF9zaG93KGJjLCBuKTsKK30KKworLyoqCisgKiBSZXR1cm4g biBiaXRzIGZyb20gdGhlIGJ1ZmZlciBidXQgZG8gbm90IGNoYW5nZSB0aGUgYnVmZmVyIHN0YXRl LgorICogbiBoYXMgdG8gYmUgaW4gdGhlIDAtMzIgcmFuZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUg dWludDMyX3QgYml0c19wZWVrKEJpdHN0cmVhbUNvbnRleHQgKmJjLCB1bnNpZ25lZCBpbnQgbikK K3sKKyAgICBhdl9hc3NlcnQyKG4gPD0gMzIpOworCisgICAgaWYgKCFuKQorICAgICAgICByZXR1 cm4gMDsKKworICAgIHJldHVybiBiaXRzX3BlZWtfbnooYmMsIG4pOworfQorCisvKioKKyAqIFJl dHVybiBuIGJpdHMgZnJvbSB0aGUgYnVmZmVyIGFzIGEgc2lnbmVkIGludGVnZXIsCisgKiBkbyBu b3QgY2hhbmdlIHRoZSBidWZmZXIgc3RhdGUuCisgKiBuIGhhcyB0byBiZSBpbiB0aGUgMC0zMiBy YW5nZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYml0c19wZWVrX3NpZ25lZChCaXRzdHJlYW1D b250ZXh0ICpiYywgdW5zaWduZWQgaW50IG4pCit7CisgICAgcmV0dXJuIHNpZ25fZXh0ZW5kKGJp dHNfcGVlayhiYywgbiksIG4pOworfQorCisvKioKKyAqIFNraXAgbiBiaXRzIGluIHRoZSBidWZm ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRzX3NraXAoQml0c3RyZWFtQ29udGV4dCAq YmMsIHVuc2lnbmVkIGludCBuKQoreworICAgIGlmIChuIDwgYmMtPmJpdHNfdmFsaWQpCisgICAg ICAgIGJpdHNfcHJpdl9za2lwX3JlbWFpbmluZyhiYywgbik7CisgICAgZWxzZSB7CisgICAgICAg IG4gLT0gYmMtPmJpdHNfdmFsaWQ7CisgICAgICAgIGJjLT5iaXRzICAgICAgID0gMDsKKyAgICAg ICAgYmMtPmJpdHNfdmFsaWQgPSAwOworCisgICAgICAgIGlmIChuID49IDY0KSB7CisgICAgICAg ICAgICB1bnNpZ25lZCBpbnQgc2tpcCA9IG4gLyA4OworCisgICAgICAgICAgICBuIC09IHNraXAg KiA4OworICAgICAgICAgICAgYmMtPnB0ciArPSBza2lwOworICAgICAgICB9CisgICAgICAgIGJp dHNfcHJpdl9yZWZpbGxfNjQoYmMpOworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIGJpdHNf cHJpdl9za2lwX3JlbWFpbmluZyhiYywgbik7CisgICAgfQorfQorCisvKioKKyAqIFNlZWsgdG8g dGhlIGdpdmVuIGJpdCBwb3NpdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJpdHNfc2Vl ayhCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgcG9zKQoreworICAgIGJjLT5wdHIgICAg ICAgID0gYmMtPmJ1ZmZlcjsKKyAgICBiYy0+Yml0cyAgICAgICA9IDA7CisgICAgYmMtPmJpdHNf dmFsaWQgPSAwOworCisgICAgYml0c19za2lwKGJjLCBwb3MpOworfQorCisvKioKKyAqIFNraXAg Yml0cyB0byBhIGJ5dGUgYm91bmRhcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgdWludDhf dCAqYml0c19hbGlnbihCaXRzdHJlYW1Db250ZXh0ICpiYykKK3sKKyAgICB1bnNpZ25lZCBpbnQg biA9IC1iaXRzX3RlbGwoYmMpICYgNzsKKyAgICBpZiAobikKKyAgICAgICAgYml0c19za2lwKGJj LCBuKTsKKyAgICByZXR1cm4gYmMtPmJ1ZmZlciArIChiaXRzX3RlbGwoYmMpID4+IDMpOworfQor CisvKioKKyAqIFJlYWQgTVBFRy0xIGRjLXN0eWxlIFZMQyAoc2lnbiBiaXQgKyBtYW50aXNzYSB3 aXRoIG5vIE1TQikuCisgKiBJZiBNU0Igbm90IHNldCBpdCBpcyBuZWdhdGl2ZS4KKyAqIEBwYXJh bSBuIGxlbmd0aCBpbiBiaXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpdHNfcmVhZF94Yml0 cyhCaXRzdHJlYW1Db250ZXh0ICpiYywgdW5zaWduZWQgaW50IG4pCit7CisgICAgaW50MzJfdCBj YWNoZSA9IGJpdHNfcGVlayhiYywgMzIpOworICAgIGludCBzaWduID0gfmNhY2hlID4+IDMxOwor ICAgIGJpdHNfcHJpdl9za2lwX3JlbWFpbmluZyhiYywgbik7CisKKyAgICByZXR1cm4gKCgoKHVp bnQzMl90KShzaWduIF4gY2FjaGUpKSA+PiAoMzIgLSBuKSkgXiBzaWduKSAtIHNpZ247Cit9CisK Ky8qKgorICogUmV0dXJuIGRlY29kZWQgdHJ1bmNhdGVkIHVuYXJ5IGNvZGUgZm9yIHRoZSB2YWx1 ZXMgMCwgMSwgMi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYml0c19kZWNvZGUwMTIoQml0c3Ry ZWFtQ29udGV4dCAqYmMpCit7CisgICAgaWYgKCFiaXRzX3JlYWRfYml0KGJjKSkKKyAgICAgICAg cmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYml0c19yZWFkX2JpdChiYykgKyAx OworfQorCisvKioKKyAqIFJldHVybiBkZWNvZGVkIHRydW5jYXRlZCB1bmFyeSBjb2RlIGZvciB0 aGUgdmFsdWVzIDIsIDEsIDAuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpdHNfZGVjb2RlMjEw KEJpdHN0cmVhbUNvbnRleHQgKmJjKQoreworICAgIGlmIChiaXRzX3JlYWRfYml0KGJjKSkKKyAg ICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMiAtIGJpdHNfcmVhZF9i aXQoYmMpOworfQorCisvKiBSZWFkIHNpZ24gYml0IGFuZCBmbGlwIHRoZSBzaWduIG9mIHRoZSBw cm92aWRlZCB2YWx1ZSBhY2NvcmRpbmdseS4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpdHNfYXBw bHlfc2lnbihCaXRzdHJlYW1Db250ZXh0ICpiYywgaW50IHZhbCkKK3sKKyAgICBpbnQgc2lnbiA9 IGJpdHNfcmVhZF9zaWduZWQoYmMsIDEpOworICAgIHJldHVybiAodmFsIF4gc2lnbikgLSBzaWdu OworfQorCitzdGF0aWMgaW5saW5lIGludCBiaXRzX3NraXBfMXN0b3BfOGRhdGEoQml0c3RyZWFt Q29udGV4dCAqcykKK3sKKyAgICBpZiAoYml0c19sZWZ0KHMpIDw9IDApCisgICAgICAgIHJldHVy biBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgd2hpbGUgKGJpdHNfcmVhZF9iaXQocykpIHsK KyAgICAgICAgYml0c19za2lwKHMsIDgpOworICAgICAgICBpZiAoYml0c19sZWZ0KHMpIDw9IDAp CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBy ZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIExVVCBlbGVtZW50IGZvciB0aGUgZ2l2 ZW4gYml0c3RyZWFtIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJpdHNf cHJpdl9zZXRfaWR4KEJpdHN0cmVhbUNvbnRleHQgKmJjLCBpbnQgY29kZSwgaW50ICpuLCBpbnQg Km5iX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWTENF bGVtICp0YWJsZSkKK3sKKyAgICB1bnNpZ25lZCBpZHg7CisKKyAgICAqbmJfYml0cyA9IC0qbjsK KyAgICBpZHggPSBiaXRzX3BlZWsoYmMsICpuYl9iaXRzKSArIGNvZGU7CisgICAgKm4gPSB0YWJs ZVtpZHhdLmxlbjsKKworICAgIHJldHVybiB0YWJsZVtpZHhdLnN5bTsKK30KKworLyoqCisgKiBQ YXJzZSBhIHZsYyBjb2RlLgorICogQHBhcmFtIGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHdo aWNoIHdpbGwgYmUgcmVhZCBhdCBvbmNlLCBtdXN0IGJlCisgKiAgICAgICAgICAgICBpZGVudGlj YWwgdG8gbmJfYml0cyBpbiBpbml0X3ZsYygpCisgKiBAcGFyYW0gbWF4X2RlcHRoIGlzIHRoZSBu dW1iZXIgb2YgdGltZXMgYml0cyBiaXRzIG11c3QgYmUgcmVhZCB0byBjb21wbGV0ZWx5CisgKiAg ICAgICAgICAgICAgICAgIHJlYWQgdGhlIGxvbmdlc3QgdmxjIGNvZGUKKyAqICAgICAgICAgICAg ICAgICAgPSAobWF4X3ZsY19sZW5ndGggKyBiaXRzIC0gMSkgLyBiaXRzCisgKiBJZiB0aGUgdmxj IGNvZGUgaXMgaW52YWxpZCBhbmQgbWF4X2RlcHRoPTEsIHRoZW4gbm8gYml0cyB3aWxsIGJlIHJl bW92ZWQuCisgKiBJZiB0aGUgdmxjIGNvZGUgaXMgaW52YWxpZCBhbmQgbWF4X2RlcHRoPjEsIHRo ZW4gdGhlIG51bWJlciBvZiBiaXRzIHJlbW92ZWQKKyAqIGlzIHVuZGVmaW5lZC4KKyAqLworc3Rh dGljIGlubGluZSBpbnQgYml0c19yZWFkX3ZsYyhCaXRzdHJlYW1Db250ZXh0ICpiYywgY29uc3Qg VkxDRWxlbSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRz LCBpbnQgbWF4X2RlcHRoKQoreworICAgIGludCBuYl9iaXRzOworICAgIHVuc2lnbmVkIGlkeCA9 IGJpdHNfcGVlayhiYywgYml0cyk7CisgICAgaW50IGNvZGUgICAgID0gdGFibGVbaWR4XS5zeW07 CisgICAgaW50IG4gICAgICAgID0gdGFibGVbaWR4XS5sZW47CisKKyAgICBpZiAobWF4X2RlcHRo ID4gMSAmJiBuIDwgMCkgeworICAgICAgICBiaXRzX3ByaXZfc2tpcF9yZW1haW5pbmcoYmMsIGJp dHMpOworICAgICAgICBjb2RlID0gYml0c19wcml2X3NldF9pZHgoYmMsIGNvZGUsICZuLCAmbmJf Yml0cywgdGFibGUpOworICAgICAgICBpZiAobWF4X2RlcHRoID4gMiAmJiBuIDwgMCkgeworICAg ICAgICAgICAgYml0c19wcml2X3NraXBfcmVtYWluaW5nKGJjLCBuYl9iaXRzKTsKKyAgICAgICAg ICAgIGNvZGUgPSBiaXRzX3ByaXZfc2V0X2lkeChiYywgY29kZSwgJm4sICZuYl9iaXRzLCB0YWJs ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYml0c19wcml2X3NraXBfcmVtYWluaW5nKGJjLCBu KTsKKworICAgIHJldHVybiBjb2RlOworfQorCisjZGVmaW5lIEJJVFNfUkxfVkxDKGxldmVsLCBy dW4sIGJjLCB0YWJsZSwgYml0cywgbWF4X2RlcHRoKSBcCisgICAgZG8geyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBuLCBu Yl9iaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVu c2lnbmVkIGludCBpbmRleCA9IGJpdHNfcGVlayhiYywgYml0cyk7ICAgICAgICAgICBcCisgICAg ICAgIGxldmVsID0gdGFibGVbaW5kZXhdLmxldmVsOyAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgICAgIG4gICAgID0gdGFibGVbaW5kZXhdLmxlbjsgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCisgICAgICAgIGlmIChtYXhfZGVwdGggPiAxICYmIG4gPCAwKSB7ICAgICAg ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiaXRzX3NraXAoYmMsIGJpdHMpOyAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuYl9iaXRzID0gLW47 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBp bmRleCA9IGJpdHNfcGVlayhiYywgbmJfYml0cykgKyBsZXZlbDsgICAgICAgICBcCisgICAgICAg ICAgICBsZXZlbCA9IHRhYmxlW2luZGV4XS5sZXZlbDsgICAgICAgICAgICAgICAgICAgICBcCisg ICAgICAgICAgICBuICAgICA9IHRhYmxlW2luZGV4XS5sZW47ICAgICAgICAgICAgICAgICAgICAg ICBcCisgICAgICAgICAgICBpZiAobWF4X2RlcHRoID4gMiAmJiBuIDwgMCkgeyAgICAgICAgICAg ICAgICAgICBcCisgICAgICAgICAgICAgICAgYml0c19za2lwKGJjLCBuYl9iaXRzKTsgICAgICAg ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbmJfYml0cyA9IC1uOyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW5kZXggPSBiaXRz X3BlZWsoYmMsIG5iX2JpdHMpICsgbGV2ZWw7ICAgICBcCisgICAgICAgICAgICAgICAgbGV2ZWwg PSB0YWJsZVtpbmRleF0ubGV2ZWw7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAg biAgICAgPSB0YWJsZVtpbmRleF0ubGVuOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAg ICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg ICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc CisgICAgICAgIHJ1biA9IHRhYmxlW2luZGV4XS5ydW47ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCisgICAgICAgIGJpdHNfc2tpcChiYywgbik7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIEFWQ09ERUNfQklUU1RS RUFNX0ggKi8KLS0gCjIuMzUuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdApmZm1wZWctZGV2ZWxAZmZtcGVn Lm9yZwpodHRwczovL2ZmbXBlZy5vcmcvbWFpbG1hbi9saXN0aW5mby9mZm1wZWctZGV2ZWwKClRv IHVuc3Vic2NyaWJlLCB2aXNpdCBsaW5rIGFib3ZlLCBvciBlbWFpbApmZm1wZWctZGV2ZWwtcmVx dWVzdEBmZm1wZWcub3JnIHdpdGggc3ViamVjdCAidW5zdWJzY3JpYmUiLgo=