From patchwork Tue Oct 23 11:15:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: joshdk@ob-encoder.com X-Patchwork-Id: 10756 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 90FC644A6AA for ; Tue, 23 Oct 2018 14:21:33 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3434968A643; Tue, 23 Oct 2018 14:21:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D5651689D22 for ; Tue, 23 Oct 2018 14:20:58 +0300 (EEST) Received: by mail-wr1-f51.google.com with SMTP id l6-v6so1275620wrt.1 for ; Tue, 23 Oct 2018 04:21:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ob-encoder-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=0u9JYnllqyDp42Iw0y2igEuWzYBUvarkigaML0HrlPQ=; b=WNe3ufG5LmnNbkDPFC8rPMsizqtwKlfsC4A8NfhmcNdrqYBf08jhRtKIGfqIVcp2Fm K5qDAeu4fF+M7UZNPblTOlB9QNUixpQBPBELUzqgyzuflgzwGnLqq9D6LYzbcxHDJXGi 1EP2daMjC6yYdlfTHcET8Ii8rnqSUh0yRluWX42dv4Kyv+79VCdF0uwQiNYexsNVQprA ArY20YC+m3/R88TrkeRQZbWxdy42/kWg2E31yu+bWYplNPnSx0ZBIPmozuYe0uPC2Zbw hBa991zUxff4gq+WkEQAdQLQ2i8f3n+7k+lmTefNC4kmEw39Iu0jkz9UKRhksxdLhLTt 2vaQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=0u9JYnllqyDp42Iw0y2igEuWzYBUvarkigaML0HrlPQ=; b=mV7ayvQP793rgSLCJj+zUNB4e6w8kLwqZlaBG46qCcCxUNyjfMF0lYaD0xv2rHoNDq MPQmGqdZZZ/a63iVPT5C3Nnh902VyjrAuRRZrWFlWjPbBMupwILA5jAAsPyhBYssZiUn ypybZ47OlDSdk7og35F31ltw17zGoXr6vJI5WBli35g0q913kGkC4QvS0+M3UZEXrdon B+Ya2XQcRGslEWuVnhsLySmPzkWe/HfX6Y/VPen64tkKZxtR5dG1vU91h1+drl/ZCcdS hyw6+FIWiX5MXw53oi3QwcBCY8VLOOlWnwfGTpsI9zKu3nK8y6gzq0Gqm3vwtGMN1lXy IwCg== X-Gm-Message-State: ABuFfojegZ9EjdS50YzUcDedLBzU0egrI60437nzNrJeHELG+w5IcmeY t9ZzXWNYvrQnOf9t2qpKPMhERdL41Q8= X-Google-Smtp-Source: ACcGV62t1cSBXZ31C6JQFiNNm5IlDrxvk0WccfskidCBEomNXuCuawLQPFH9ek2Q1stw6o6b4K+mcA== X-Received: by 2002:a5d:4e87:: with SMTP id e7-v6mr25339486wru.115.1540293315728; Tue, 23 Oct 2018 04:15:15 -0700 (PDT) Received: from localhost.localdomain (cpc107625-sotn16-2-0-cust150.15-1.cable.virginm.net. [81.104.78.151]) by smtp.gmail.com with ESMTPSA id z16-v6sm1196137wmc.0.2018.10.23.04.15.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Oct 2018 04:15:14 -0700 (PDT) From: joshdk@ob-encoder.com X-Google-Original-From: joshdk@obe.tv To: ffmpeg-devel@ffmpeg.org Date: Tue, 23 Oct 2018 12:15:13 +0100 Message-Id: <20181023111513.26668-1-joshdk@obe.tv> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181022204304.GM3743@michaelspb> References: <20181022204304.GM3743@michaelspb> Subject: [FFmpeg-devel] [PATCH v5] fate: add api-h264-slice test X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 Cc: Josh de Kock MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Josh de Kock This test ensures that you are able to send N number of slice NALUs in slice threaded mode to be decoded simultaneously --- Prints a warning to the user when threading is not enabled, slice NALUs should still be checked for proper decoding irregardless of whether threads are enabled. Hopefully this is the last iteration, sorry this took so long. I'll now have a list of 'gotchas' for future test writing though :) tests/api/Makefile | 1 + tests/api/api-h264-slice-test.c | 220 +++++++++++++++++++++++ tests/fate/api.mak | 4 + tests/ref/fate/api-h264-slice | 309 ++++++++++++++++++++++++++++++++ 4 files changed, 534 insertions(+) create mode 100644 tests/api/api-h264-slice-test.c create mode 100644 tests/ref/fate/api-h264-slice diff --git a/tests/api/Makefile b/tests/api/Makefile index 759dd9d243..b5c4ccae23 100644 --- a/tests/api/Makefile +++ b/tests/api/Makefile @@ -1,5 +1,6 @@ APITESTPROGS-$(call ENCDEC, FLAC, FLAC) += api-flac APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264 +APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264-slice APITESTPROGS-yes += api-seek APITESTPROGS-yes += api-codec-param APITESTPROGS-$(call DEMDEC, H263, H263) += api-band diff --git a/tests/api/api-h264-slice-test.c b/tests/api/api-h264-slice-test.c new file mode 100644 index 0000000000..c87ceff109 --- /dev/null +++ b/tests/api/api-h264-slice-test.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2001 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#define MAX_SLICES 8 + +// ./fate 2 ./crew_cif out.y4m + +#include "config.h" + +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#endif +#if HAVE_IO_H +#include +#endif +#include +#include +#include + +#include +#include +#include + +static int header = 0; + +static void decode(AVCodecContext *dec_ctx, AVFrame *frame, + AVPacket *pkt) +{ + static uint64_t frame_cnt = 0; + int ret; + + ret = avcodec_send_packet(dec_ctx, pkt); + if (ret < 0) { + fprintf(stderr, "Error sending a packet for decoding: %s\n", av_err2str(ret)); + exit(1); + } + + while (ret >= 0) { + const AVPixFmtDescriptor *desc; + char *sum; + struct AVHashContext *hash; + + ret = avcodec_receive_frame(dec_ctx, frame); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) { + return; + } else if (ret < 0) { + fprintf(stderr, "Error during decoding: %s\n", av_err2str(ret)); + exit(1); + } + + if (!header) { + printf( + "#format: frame checksums\n" + "#version: 2\n" + "#hash: MD5\n" + "#tb 0: 1/30\n" + "#media_type 0: video\n" + "#codec_id 0: rawvideo\n" + "#dimensions 0: 352x288\n" + "#sar 0: 128/117\n" + "#stream#, dts, pts, duration, size, hash\n"); + header = 1; + } + desc = av_pix_fmt_desc_get(dec_ctx->pix_fmt); + av_hash_alloc(&hash, "md5"); + av_hash_init(hash); + sum = av_mallocz(av_hash_get_size(hash) * 2 + 1); + + for (int i = 0; i < frame->height; i++) + av_hash_update(hash, &frame->data[0][i * frame->linesize[0]], frame->width); + for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++) + av_hash_update(hash, &frame->data[1][i * frame->linesize[1]], frame->width >> desc->log2_chroma_w); + for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++) + av_hash_update(hash, &frame->data[2][i * frame->linesize[2]], frame->width >> desc->log2_chroma_w); + + av_hash_final_hex(hash, sum, av_hash_get_size(hash) * 2 + 1); + printf("0, %10"PRId64", %10"PRId64", 1, %8d, %s\n", + frame_cnt, frame_cnt, + (frame->width * frame->height + 2 * (frame->height >> desc->log2_chroma_h) * (frame->width >> desc->log2_chroma_w)), sum); + frame_cnt += 1; + av_free(hash); + av_free(sum); + } +} + +int main(int argc, char **argv) +{ + const AVCodec *codec; + AVCodecContext *c = NULL; + AVFrame *frame; + unsigned int threads; + AVPacket *pkt; + FILE *fd; + char nal[MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE]; + int nals = 0; + char *p = nal; + + if (argc < 4) { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(1); + } + + if (!(threads = strtoul(argv[1], NULL, 0))) + threads = 1; + else if (threads > MAX_SLICES) + threads = MAX_SLICES; + +#ifdef _WIN32 + setmode(fileno(stdout), O_BINARY); +#endif + + if (!(pkt = av_packet_alloc())) + exit(1); + + if (!(codec = avcodec_find_decoder(AV_CODEC_ID_H264))) { + fprintf(stderr, "Codec not found\n"); + exit(1); + } + + if (!(c = avcodec_alloc_context3(codec))) { + fprintf(stderr, "Could not allocate video codec context\n"); + exit(1); + } + + c->width = 352; + c->height = 288; + + c->flags2 |= AV_CODEC_FLAG2_CHUNKS; + c->thread_type = FF_THREAD_SLICE; + c->thread_count = threads; + + if (avcodec_open2(c, codec, NULL) < 0) { + fprintf(stderr, "Could not open codec\n"); + exit(1); + } + +#if HAVE_THREADS + if (c->active_thread_type != FF_THREAD_SLICE) { + fprintf(stderr, "Couldn't activate slice threading: %d\n", c->active_thread_type); + exit(1); + } +#else + fprintf(stderr, "WARN: not using threads, only checking decoding slice NALUs\n"); +#endif + + if (!(frame = av_frame_alloc())) { + fprintf(stderr, "Could not allocate video frame\n"); + exit(1); + } + + if (!(fd = fopen(argv[2], "rb"))) { + fprintf(stderr, "Couldn't open NALU file: %s\n", argv[2]); + exit(1); + } + + while(1) { + uint16_t size = 0; + ssize_t ret = fread(&size, 1, sizeof(uint16_t), fd); + if (ret < 0) { + perror("Couldn't read size"); + exit(1); + } else if (ret != sizeof(uint16_t)) + break; + + ret = fread(p, 1, size, fd); + if (ret < 0 || ret != size) { + perror("Couldn't read data"); + exit(1); + } + p += ret; + + if (++nals >= threads) { + pkt->data = nal; + pkt->size = p - nal; + decode(c, frame, pkt); + memset(nal, 0, MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE); + nals = 0; + p = nal; + } + } + + if (nals) { + pkt->data = nal; + pkt->size = p - nal; + decode(c, frame, pkt); + } + + decode(c, frame, NULL); + + fclose(fd); + avcodec_free_context(&c); + av_frame_free(&frame); + av_packet_free(&pkt); + + return 0; +} diff --git a/tests/fate/api.mak b/tests/fate/api.mak index eb656e68a3..132c38f2c2 100644 --- a/tests/fate/api.mak +++ b/tests/fate/api.mak @@ -12,6 +12,10 @@ FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264 fate-api-h264: $(APITESTSDIR)/api-h264-test$(EXESUF) fate-api-h264: CMD = run $(APITESTSDIR)/api-h264-test $(TARGET_SAMPLES)/h264-conformance/SVA_NL2_E.264 +FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264-slice +fate-api-h264-slice: $(APITESTSDIR)/api-h264-slice-test$(EXESUF) +fate-api-h264-slice: CMD = run $(APITESTSDIR)/api-h264-slice-test 2 $(TARGET_SAMPLES)/h264/crew_cif.nal api-h264-slice.h264 + FATE_API_LIBAVFORMAT-$(call DEMDEC, FLV, FLV) += fate-api-seek fate-api-seek: $(APITESTSDIR)/api-seek-test$(EXESUF) fate-lavf-flv_fmt fate-api-seek: CMD = run $(APITESTSDIR)/api-seek-test $(TARGET_PATH)/tests/data/lavf/lavf.flv 0 720 diff --git a/tests/ref/fate/api-h264-slice b/tests/ref/fate/api-h264-slice new file mode 100644 index 0000000000..1d463d30ac --- /dev/null +++ b/tests/ref/fate/api-h264-slice @@ -0,0 +1,309 @@ +#format: frame checksums +#version: 2 +#hash: MD5 +#tb 0: 1/30 +#media_type 0: video +#codec_id 0: rawvideo +#dimensions 0: 352x288 +#sar 0: 128/117 +#stream#, dts, pts, duration, size, hash +0, 0, 0, 1, 152064, 28a2f99d62b553403fcffc1f680d5403 +0, 1, 1, 1, 152064, cd95f40841e08160ace0d64506f8adbf +0, 2, 2, 1, 152064, 32f37a1b3ddc2b8b0f6283f0c403a976 +0, 3, 3, 1, 152064, 643c0b0702072038578ef5ae2000c1a0 +0, 4, 4, 1, 152064, 8d9c9660705f7533e7f49f11693aedf9 +0, 5, 5, 1, 152064, 66a794f8a116c055451091e0e4cd911e +0, 6, 6, 1, 152064, 8ad529648796ae6da279de0b7ca34f72 +0, 7, 7, 1, 152064, 898ad4170eb740d713de254eb4bfe255 +0, 8, 8, 1, 152064, f96cfc1f00df10003e144529a5fae6c6 +0, 9, 9, 1, 152064, 0351a3b68dc87ba5963624e1461788da +0, 10, 10, 1, 152064, 6718e4086a0039584bcc37dcd4be6a67 +0, 11, 11, 1, 152064, fb4fec78d9434b9579b31f8ad0472762 +0, 12, 12, 1, 152064, ec2dcc547d84e15383dcee8462bb9d0c +0, 13, 13, 1, 152064, ea62711bf59b4d1d56cb9dbcb68a8eda +0, 14, 14, 1, 152064, 75b1cb899a9d9e695106f187c20b91f8 +0, 15, 15, 1, 152064, 44a13e4235c2ed3692af5ef698efe4d3 +0, 16, 16, 1, 152064, 6d5f1249d96573782fa95e9228d1ad0a +0, 17, 17, 1, 152064, fce8503dd9472fc7932ffbe21425d45a +0, 18, 18, 1, 152064, e93489a6b4c38d611493a3721aa994d7 +0, 19, 19, 1, 152064, 04580677a663ddba1b747c2ab0d598e6 +0, 20, 20, 1, 152064, a28cceb666c92eaecc3da3e092b83715 +0, 21, 21, 1, 152064, ba9ce0f84fb16c27453666265ad54e35 +0, 22, 22, 1, 152064, 946e014822ab2b45c52d3e08e7db97c2 +0, 23, 23, 1, 152064, b7a40ebb6ac72b322ccfca2568fa521a +0, 24, 24, 1, 152064, cb5a0564af00a00496950ad705a160ce +0, 25, 25, 1, 152064, dbad9e8e79c04b1df497884ec28e3a59 +0, 26, 26, 1, 152064, 3c748cdc0e6ec79ca72482e22f0c3ef8 +0, 27, 27, 1, 152064, 1740911da2ebbdc729cbbea0df466c44 +0, 28, 28, 1, 152064, 3b322e03fcc16d6a0dea651634ce0b40 +0, 29, 29, 1, 152064, a7fca405425015b85cb58ec1aece575b +0, 30, 30, 1, 152064, 2004eec0c923f1855b4b918e6dcb5e02 +0, 31, 31, 1, 152064, 20542f58f1622f58f3cbf4b2bf0b772f +0, 32, 32, 1, 152064, 8872f5cb900ed8d317f3abe50a147934 +0, 33, 33, 1, 152064, 774ba43dc0cd7932099e3e0633e25721 +0, 34, 34, 1, 152064, 4f2d9b7e6d115bd103ccd9945f85582f +0, 35, 35, 1, 152064, f53542ca7f6d5ec462770ffff3f4bfd0 +0, 36, 36, 1, 152064, 43b5f8c4e6dc3dc1acc903687bc90293 +0, 37, 37, 1, 152064, aa7d265ab285ded777a970debe6a08d5 +0, 38, 38, 1, 152064, 818ae082b3dd9557e04710d7cfd700be +0, 39, 39, 1, 152064, 44cfe472ccedf8a44d0b90c97932caae +0, 40, 40, 1, 152064, 5d2756c81c90bb10484e2e892fce0e0c +0, 41, 41, 1, 152064, c1b254a4b66dc9d769e10316976f5538 +0, 42, 42, 1, 152064, 03808a3f7b01293dbe6089b33e3dc103 +0, 43, 43, 1, 152064, 8c689a6143a8a89415d2e645bb0fe925 +0, 44, 44, 1, 152064, 24268cac7d78eefd8e247ec599e60b4f +0, 45, 45, 1, 152064, ac3195c57a3ebe3871992acfc3182e2f +0, 46, 46, 1, 152064, 8730a99fb5a2573475f61d4e7998ba44 +0, 47, 47, 1, 152064, 651042c34273096db82879fcdd91310d +0, 48, 48, 1, 152064, 972b47241098a9b6471ba6c8ccc2b83b +0, 49, 49, 1, 152064, e8e53022355e6bf7ac50d53bcb1bdc92 +0, 50, 50, 1, 152064, e5b003b04a88e0d60d446eb5b600cc66 +0, 51, 51, 1, 152064, 1c2317c071a33b0b465bbcea04411ddf +0, 52, 52, 1, 152064, 7bd53f4e852370aaeb6b0d042d24b94a +0, 53, 53, 1, 152064, 6ef30966b0d9c0d92b2350e2f45197a8 +0, 54, 54, 1, 152064, 354e2afff0d056193d6c4c2667c638d3 +0, 55, 55, 1, 152064, e67767e97f44c3ef80ea4acee41af0ff +0, 56, 56, 1, 152064, 32589395bf7d07c1c6df644d43b5bbba +0, 57, 57, 1, 152064, 2f2b56210b87142fa3620cce5c56af02 +0, 58, 58, 1, 152064, 599781773ace555c82ac591cc2acf8ec +0, 59, 59, 1, 152064, 2465cf6313dab6bda9171993ff6168de +0, 60, 60, 1, 152064, 54cc6c8a9b3fd95b9700d319c4a69297 +0, 61, 61, 1, 152064, 9e813429ebf7ee4e11fcd4976974fea0 +0, 62, 62, 1, 152064, fac0303897b4d1bd1a202fe0a7d1c6f7 +0, 63, 63, 1, 152064, accb382b99f2d27cefbc9f7ea315f80c +0, 64, 64, 1, 152064, b88711feaee9f7f84da34028b7e2cc81 +0, 65, 65, 1, 152064, 80549aebdcc5629dfc3bee8112536bac +0, 66, 66, 1, 152064, 9c63aa480b5d9937d839b809ba67eee2 +0, 67, 67, 1, 152064, 5e5a729c45a995ba2a97083fca69c9e9 +0, 68, 68, 1, 152064, 6b59c5d4460d78fa337b94b080e72215 +0, 69, 69, 1, 152064, 166d675f774f4f74dbce7e2728afd16c +0, 70, 70, 1, 152064, 3051629ff9281ea8879bce0ed62c1e71 +0, 71, 71, 1, 152064, c2ff4493434ca4fea45c724c10bcbe55 +0, 72, 72, 1, 152064, 907274f16ebeb7c09de8bc124c1fe586 +0, 73, 73, 1, 152064, 88efefc9fc00d88fbce20f4d74a55d25 +0, 74, 74, 1, 152064, 357bdbcb828c088b748022df9e47b9c7 +0, 75, 75, 1, 152064, 4550087923c1d4195ab536899a99d429 +0, 76, 76, 1, 152064, 2b07777d9109577eaedc87321dd3ff69 +0, 77, 77, 1, 152064, 4a377c552c62cba06d5285aa8478a540 +0, 78, 78, 1, 152064, a0e893c028e106c2394f0578f00ae88a +0, 79, 79, 1, 152064, c0db0e2ee3768d2e4e71581a2be30707 +0, 80, 80, 1, 152064, 954e0cd38b00ea2181b8c322511536f0 +0, 81, 81, 1, 152064, 53ff687670a2490ac3f94405014251b8 +0, 82, 82, 1, 152064, 64a588b7adbc560ec4ad6823c37e41c6 +0, 83, 83, 1, 152064, 60d65e899976214cd3b2b5abb10f2b83 +0, 84, 84, 1, 152064, 1bf0efef4b204a72d05b21c18a569585 +0, 85, 85, 1, 152064, 65d814be6b698ab1185f082c9c9d7de3 +0, 86, 86, 1, 152064, de26e7e663aaeb642e0a94776c5bf22c +0, 87, 87, 1, 152064, f7b0b259ccf21e59fcacd95945a013c3 +0, 88, 88, 1, 152064, 7f3185bb4dc3368733bd29c9aa9e08eb +0, 89, 89, 1, 152064, 3cedc14798d145fcdc8b8a3082de3b88 +0, 90, 90, 1, 152064, c5792622ca4a04d21e1f2c2b2ff692fe +0, 91, 91, 1, 152064, d13199fa94e53643902a8a26e33c9862 +0, 92, 92, 1, 152064, b380359e836896d7698a8dadfe6d6fdc +0, 93, 93, 1, 152064, 4c7c5f1f093f7bcaddf06068b9b1d2e5 +0, 94, 94, 1, 152064, 73f33e1eedea9aa5e6c3f2b636dd2c23 +0, 95, 95, 1, 152064, f0d2aad6477ace945f87b25cb44f3ff0 +0, 96, 96, 1, 152064, d90bddd7c2279bbd0266a26915202712 +0, 97, 97, 1, 152064, 0b377a48dea8fc2702395796808af63f +0, 98, 98, 1, 152064, ea0099179e806a9680f019446e39d125 +0, 99, 99, 1, 152064, a77dd3069c54b255e45b261f31be80d2 +0, 100, 100, 1, 152064, d362dcbe415329e713ff6ef9e6447d87 +0, 101, 101, 1, 152064, 15441bcb307ac24766ceba8db42f9413 +0, 102, 102, 1, 152064, 79b953e72d11d3fa6d6974e4b8b13392 +0, 103, 103, 1, 152064, ec8c35c829fac56ca8ae2f0160ae5d7f +0, 104, 104, 1, 152064, c104f8f1d17629b0449f4a2af2e40f73 +0, 105, 105, 1, 152064, 4661c4b3c2b1a03a8e23e7e88e974f22 +0, 106, 106, 1, 152064, 7cb48bae9841f67294b2e25a73d46a8e +0, 107, 107, 1, 152064, bddcb2c64a4257760f50714ec8c49243 +0, 108, 108, 1, 152064, c2123750802357c25c352f09bd1b1de2 +0, 109, 109, 1, 152064, 6eb5af4f3ad69cc88e0c08f6aa9bb034 +0, 110, 110, 1, 152064, 063991a633a051d6889f0fff41059e5f +0, 111, 111, 1, 152064, fa736839a01ad04fe08d437c7fa60a2d +0, 112, 112, 1, 152064, 85a43397c5a1defe15b61464c8d1457a +0, 113, 113, 1, 152064, da50c437613be59486012b69c7953f63 +0, 114, 114, 1, 152064, eb32e24757a98192928324d3a389a3dc +0, 115, 115, 1, 152064, 1bf511fb8245e3be71ebefdcf506575d +0, 116, 116, 1, 152064, 4479c195c4cd4111afe561a07c0f626d +0, 117, 117, 1, 152064, 0b1815f0c28bb55aae515a5dc3a34f3b +0, 118, 118, 1, 152064, 300d3c32442bd554384b3c804dd519ad +0, 119, 119, 1, 152064, 197df868e0488b8b12c0b42d8c4b2aec +0, 120, 120, 1, 152064, 03bce34c3214e0144a0928b9b9acc8e8 +0, 121, 121, 1, 152064, ba73a879b8fca5db4a354075b26ccb6a +0, 122, 122, 1, 152064, b1c34c6d2535bf1e7af3a6936d1627df +0, 123, 123, 1, 152064, 77d162995974428c5c7766ee5627eac1 +0, 124, 124, 1, 152064, fa4c70aa68850bcae2579046557c0b5f +0, 125, 125, 1, 152064, 63ce618e67f380000030c97db78ac4ae +0, 126, 126, 1, 152064, 7e32538d501127faf058792e83fbbe43 +0, 127, 127, 1, 152064, 61bc1d685553a97a7c3b0cbb3790faad +0, 128, 128, 1, 152064, 57f3b97e4a80ded30b9e8f12cfc8ff44 +0, 129, 129, 1, 152064, 31db51a64307ca6f1db866a01befa301 +0, 130, 130, 1, 152064, 59924d342068caf1ad7329b947279e2d +0, 131, 131, 1, 152064, 2f0f9dd3056cac40c17684bcccdf267d +0, 132, 132, 1, 152064, b00df17142f99bdc077cb2e4c5c8b747 +0, 133, 133, 1, 152064, e7c40734dea5433038b975666be7b21e +0, 134, 134, 1, 152064, 51d77965d3a9d431a2c409244c9bc465 +0, 135, 135, 1, 152064, 15b54bdc5e2098fe7c01ce689babe08b +0, 136, 136, 1, 152064, 3fa3284ae3f714ea197ad614bff7c5c5 +0, 137, 137, 1, 152064, c6512a19b7b1b29c05c7b825b41ab930 +0, 138, 138, 1, 152064, b13c8bc436186d47595dc69186f1f927 +0, 139, 139, 1, 152064, d5eff490784883a93dd3aaea08c46d5b +0, 140, 140, 1, 152064, a005ac77851ea3a44e261d9067ee835f +0, 141, 141, 1, 152064, 6706b74dc10c72f27e9f6341710e56ac +0, 142, 142, 1, 152064, 46479f86f53f55d2094354eb9bed78df +0, 143, 143, 1, 152064, 17f5cd040eb766ece29d1c1e283e9c20 +0, 144, 144, 1, 152064, 4f34c43eeeac2c751aac486ba42d9b9a +0, 145, 145, 1, 152064, 24c16b9d01c316305686af1a12f7be49 +0, 146, 146, 1, 152064, 9ae9b1f109fa3d02f226fefdaf395be6 +0, 147, 147, 1, 152064, eb98c1c6e473d8b53069206ffc69a9cb +0, 148, 148, 1, 152064, f0768d9cb981d277b70d1b3b928f4915 +0, 149, 149, 1, 152064, c1a5cef2bdb3f3b932a051c29d31f889 +0, 150, 150, 1, 152064, 8f75fb3a6f994b90999f8b0c664ad7c4 +0, 151, 151, 1, 152064, 3a778c9c86afaf03f2e60668d849e25b +0, 152, 152, 1, 152064, 4c3dd11965a2cf55790088a99289981a +0, 153, 153, 1, 152064, 763f810845e6f4e798a6edb6633f5506 +0, 154, 154, 1, 152064, 6b305b9d79151c1644c924d522091eea +0, 155, 155, 1, 152064, e981ce0e01f24eca2e89c7c81480fb07 +0, 156, 156, 1, 152064, 91349f36d44383dc1cd72f0a3f9c76ed +0, 157, 157, 1, 152064, 9a67f029ed2370983ff3e24d8c2c65d2 +0, 158, 158, 1, 152064, cf5717cb593fbafad6abf8bdb7ca2737 +0, 159, 159, 1, 152064, 7ece8c2497ca72e4f8e9eb69048391f8 +0, 160, 160, 1, 152064, 9dccce22ca32a7ec8890f77e4de1fa42 +0, 161, 161, 1, 152064, f418dc75e266c47ba84275741f0635cb +0, 162, 162, 1, 152064, aeddab213baab78ed0c44abb7409e291 +0, 163, 163, 1, 152064, a0b5e3c0616105580a310529ed71d072 +0, 164, 164, 1, 152064, e0e96da8724b472868634b6b145ebb2e +0, 165, 165, 1, 152064, bdaaf9623f5d329c8706e4850db0beea +0, 166, 166, 1, 152064, 6566ddd82da9096458e039caa7d56674 +0, 167, 167, 1, 152064, b882cb5f1c6059d338273e8fdb18e41e +0, 168, 168, 1, 152064, f9723e59ce02828e64c16d32216441b2 +0, 169, 169, 1, 152064, 98b5a843bf125eeae0240bde40016d6a +0, 170, 170, 1, 152064, 8958b81f8a028928c4b9a7024a4eebff +0, 171, 171, 1, 152064, 25a8acfdd14a472a8090d41626472070 +0, 172, 172, 1, 152064, 6faf859c0b264b6d76e0823c6045cebd +0, 173, 173, 1, 152064, 0774a3470360c37ede375d19aebe1844 +0, 174, 174, 1, 152064, 5dd921d4f05976fb6bbf5cc6996254e0 +0, 175, 175, 1, 152064, d03d789e3c439420a07e3e919ddd1cf0 +0, 176, 176, 1, 152064, 1fad139023f7d7022f8f65a6e31f68a9 +0, 177, 177, 1, 152064, 0c706070d649da054eeaf686d2e14a1d +0, 178, 178, 1, 152064, 51e4156b19bdc55e993d1956473827e3 +0, 179, 179, 1, 152064, e447458fd86c022852cedf56dc58f34f +0, 180, 180, 1, 152064, 59732caeb824f052044b4434ef564227 +0, 181, 181, 1, 152064, cf5ccf671ddc89e1f430878afb86fced +0, 182, 182, 1, 152064, e3e98f92e4cf8f0ccce27482407ebbf1 +0, 183, 183, 1, 152064, 089d236d04d1918b319524e3002d21c8 +0, 184, 184, 1, 152064, 7063afc35aa2c24b1e3dc781bb612af1 +0, 185, 185, 1, 152064, 902e5153028215ac60bf0f998673e3ca +0, 186, 186, 1, 152064, 2360fb2ed2b0e7c37a318fb7f9df7550 +0, 187, 187, 1, 152064, be0788a6a06906f57f7ad1e0e4c0aba7 +0, 188, 188, 1, 152064, db90ee89bbeefcd54b79f022ed9d62d9 +0, 189, 189, 1, 152064, 7237b5c1e6f182805d4e324e636f2a45 +0, 190, 190, 1, 152064, e5da5c0643e457087f54935cfa50f7c0 +0, 191, 191, 1, 152064, 89b5d462accdc4cfaed1e57de4589f39 +0, 192, 192, 1, 152064, b670710e2f897f20d83c42bcd0ee7d85 +0, 193, 193, 1, 152064, 9c7ceba12895f2a670e4a1498d28951c +0, 194, 194, 1, 152064, 4b426b0719a67bc228e1928e83b47b53 +0, 195, 195, 1, 152064, b2c646cd4d3b100619fd6e626ea8b3cb +0, 196, 196, 1, 152064, ad9abc825e1b87ec0defb1df032364e6 +0, 197, 197, 1, 152064, 21423e23c708f43a9d615bc2bc700d97 +0, 198, 198, 1, 152064, 14a42211968cd4b8416ebc0285eb02b3 +0, 199, 199, 1, 152064, a45eb0c4f6a9c5beeb90a292be71461e +0, 200, 200, 1, 152064, f9bfba991f0a0ea6bbfdde5d23bd8785 +0, 201, 201, 1, 152064, 49d33752288ddef86dc702652f688c75 +0, 202, 202, 1, 152064, 97b50290b4a1e2f31c704cc302fe89d8 +0, 203, 203, 1, 152064, c3006dcc89d2f45379c840c7dd5f7559 +0, 204, 204, 1, 152064, 4a861c22e63478ffe73571909da9a15f +0, 205, 205, 1, 152064, e7a8bff496059d3cd40470920fb26c75 +0, 206, 206, 1, 152064, 989d818e0d7d8eea14da209c37ad3e0b +0, 207, 207, 1, 152064, 1732c746805ca221c85fb5570911378d +0, 208, 208, 1, 152064, 60ece5f795f5756bef34ba84fb6fec2a +0, 209, 209, 1, 152064, 9fd355648ef40dd0e15c81554b111637 +0, 210, 210, 1, 152064, 2a3b9220b98ea648e395ab9ea12023d2 +0, 211, 211, 1, 152064, eea2a06e68196917ba2a754563953cd5 +0, 212, 212, 1, 152064, 3c2ec831a9802a968654df1bee81ca40 +0, 213, 213, 1, 152064, 590abeedce1cfa9df8a00d7ab9cf2c8e +0, 214, 214, 1, 152064, bc07f89391568a78854f99ad9fd62c49 +0, 215, 215, 1, 152064, 0bd866450376be96a85690595d96d909 +0, 216, 216, 1, 152064, 33483531a4d760bdc30a77d5de49aff7 +0, 217, 217, 1, 152064, b0294c6e784fa3f15532331063c5036f +0, 218, 218, 1, 152064, f4f3ba2781b2a9be3c2dd5b4c445e0d9 +0, 219, 219, 1, 152064, 8550626512e0602a1c53bfb8c51427d8 +0, 220, 220, 1, 152064, 0c2d0229196825910e5f487c33b45ef3 +0, 221, 221, 1, 152064, 93dbbed468f0012b921aa0b2b6751a70 +0, 222, 222, 1, 152064, 2f0d99dc6d4b5c65bc18946b1e6cdc4c +0, 223, 223, 1, 152064, fb25cbe655fc050bbcbfe9cc3fa06ffe +0, 224, 224, 1, 152064, 376d3f894957b3bac2308f2662ad5c82 +0, 225, 225, 1, 152064, 46b5c54ea38987b9e3d371a64d06300d +0, 226, 226, 1, 152064, 9bd24bc1a94aed633ff63aac5b720269 +0, 227, 227, 1, 152064, df0bb3f7724048f67c4a60a1dbb3d5e6 +0, 228, 228, 1, 152064, a9d1c8b8007ea61c0ab2f97b3cfc2aea +0, 229, 229, 1, 152064, fd5a4ccab51773b09edca30e665999e8 +0, 230, 230, 1, 152064, 0eaf8218244c9b2e78660cf923755557 +0, 231, 231, 1, 152064, 40f4fc64016fd148b14aea2da7652125 +0, 232, 232, 1, 152064, 6f075b312e9f7e1b4c3343441a9e1f7f +0, 233, 233, 1, 152064, 93f7523632abfe91fa701208aafdc29a +0, 234, 234, 1, 152064, 3c3ea7aa12a89df2309b76c22053b0ff +0, 235, 235, 1, 152064, 2181a1aec4278efa70dec025878d88c0 +0, 236, 236, 1, 152064, 35dffda6543fdf43ad182484564abda8 +0, 237, 237, 1, 152064, bf2b65551a8fcf3b1b4185e0ebfca2a7 +0, 238, 238, 1, 152064, 49fd2dd18ddbb7f005c3705910bff99f +0, 239, 239, 1, 152064, 9f6826599ebd45a1159e46d293fc8f7b +0, 240, 240, 1, 152064, 5b88b8ec1da51a165e2741f8a6b710ad +0, 241, 241, 1, 152064, a81229c0d464cc8d376f8b0153b50fc2 +0, 242, 242, 1, 152064, 07ef482c1c9967700a6cef5cdd010384 +0, 243, 243, 1, 152064, d4ebe4de6e096f7cccd5ae2be856e983 +0, 244, 244, 1, 152064, 6daf25ffb2c2baf02e483e84733fc37b +0, 245, 245, 1, 152064, d52f485c747e945bfe34aeeaaec4fe78 +0, 246, 246, 1, 152064, 408e5b502af7a10454af6f388e2722be +0, 247, 247, 1, 152064, 684d285dc9c08791ce16e02a1f65e22b +0, 248, 248, 1, 152064, 5de9b8f8678c6b7a1ff04f217ef8c0c3 +0, 249, 249, 1, 152064, b60f9e37dcfc3924adcfc96d08fb2656 +0, 250, 250, 1, 152064, 8975d551bb7c01cb520b5694e73d1809 +0, 251, 251, 1, 152064, af55f9897a3fa51eacdcebf3a21f5fe5 +0, 252, 252, 1, 152064, 10c21c5167cba09ce54f361e88e6e3c9 +0, 253, 253, 1, 152064, 8cb92c4a8d32fe00a92c5bd4a163cc45 +0, 254, 254, 1, 152064, 3d39fd1222c8421f0eed3c8249c3d772 +0, 255, 255, 1, 152064, 43c5629af47dc4fd659bffe481e84999 +0, 256, 256, 1, 152064, ad6d5a0f4d2d2738809b7f610f6da823 +0, 257, 257, 1, 152064, d2f0dbca68098d58468e94b84ef0fb8b +0, 258, 258, 1, 152064, 247487ae60500313df92dd0175ac4e0f +0, 259, 259, 1, 152064, cfbbabb4b8c93c87c221f76a155bb0fc +0, 260, 260, 1, 152064, c708254a644abc41788d717dd59b8baf +0, 261, 261, 1, 152064, fa710d87bddd1a65970c5618a8a0158f +0, 262, 262, 1, 152064, 31210937c8a67c6aafda2e03226b9770 +0, 263, 263, 1, 152064, ac518a56fc537de251f3d28d380e25cb +0, 264, 264, 1, 152064, afcb7642c336bcef9b605a40e518d305 +0, 265, 265, 1, 152064, 15fd29e16aaebae6f74e49455631c1f8 +0, 266, 266, 1, 152064, 938b90999b05595e9875c6d4f9836407 +0, 267, 267, 1, 152064, 2fe744b939902a5f4bb69e9243c55d08 +0, 268, 268, 1, 152064, a902057edac1638a1cd218fe5b88bfc2 +0, 269, 269, 1, 152064, 78087115b9600b5499866c127d175c0f +0, 270, 270, 1, 152064, 877c729e2d2b599dd6cac1f59f12e068 +0, 271, 271, 1, 152064, 77e6b4b761902fbe27fb0ff9eb6d02ac +0, 272, 272, 1, 152064, dd3ee373cb4935eca46947aedda3b991 +0, 273, 273, 1, 152064, b3ee6b4a18f6d20f9b9fd8dc9e8af90e +0, 274, 274, 1, 152064, 492afb7421667468fa95017c693ec47b +0, 275, 275, 1, 152064, 9abb912d8101de895b8f482c199934c2 +0, 276, 276, 1, 152064, 08ca372dfb5e90382f1b58345a0e51b1 +0, 277, 277, 1, 152064, 805559cb3f3385e7865df692336dba29 +0, 278, 278, 1, 152064, c5cc85e4d44010e048fd2013535d7180 +0, 279, 279, 1, 152064, ef9a05a7a4e0b5beff9a8119af44ebc7 +0, 280, 280, 1, 152064, e6983be0a0c1705cfede1e7476aad381 +0, 281, 281, 1, 152064, a4bb0c3d4deb17784b07d3713db05302 +0, 282, 282, 1, 152064, 0fd5bb9259e8c27aba7670b08cd9a26b +0, 283, 283, 1, 152064, 43d6df9fd672b13e2c59db924e9fe30b +0, 284, 284, 1, 152064, 3aaf3b87705c46495c9d1b9f4ea706bf +0, 285, 285, 1, 152064, 0d2ba631f5c716d9c5e5b2a75d3b6433 +0, 286, 286, 1, 152064, bf29cc016dce85e621aaa7647fae1544 +0, 287, 287, 1, 152064, 3374284a808d79e9be32bf3610b0fd17 +0, 288, 288, 1, 152064, ea3f305e76009f3bf2cd5014d339eafa +0, 289, 289, 1, 152064, 95ce7320a841a71b5a8871cef385ce41 +0, 290, 290, 1, 152064, 88613d96dbda681edab4ed41c3f08536 +0, 291, 291, 1, 152064, b9e9e9045b91c4f7917274088de64a5e +0, 292, 292, 1, 152064, e0b90055449e7403289a8dda9c02add0 +0, 293, 293, 1, 152064, 367ee1603fa7778dad3e99be8db779ee +0, 294, 294, 1, 152064, 6bb0eaa6140d673b452eee6ac6c262c2 +0, 295, 295, 1, 152064, 9af4ef919ae61e1597db1b9acd6af95a +0, 296, 296, 1, 152064, e8f29872e86e54ac26b5fb0a20f10d3e +0, 297, 297, 1, 152064, 09aaad95cd7d173bfe609b79440cbfc8 +0, 298, 298, 1, 152064, c03abe502be10f76e33d93e1c40cc674 +0, 299, 299, 1, 152064, 3e7e315be8aef281714a63f4cf086085