From patchwork Tue Oct 9 12:07:15 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: 10562 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:ab0:73d2:0:0:0:0:0 with SMTP id m18csp4806770uaq; Tue, 9 Oct 2018 05:07:28 -0700 (PDT) X-Google-Smtp-Source: ACcGV60m8t20UPMKCAqBr2Lg3pW6V4IjARQpU6vzNQHK1T/Gm/fe0vjBOGo7dZt0aGvFqueq7YWL X-Received: by 2002:adf:cd8c:: with SMTP id q12-v6mr20008505wrj.171.1539086848212; Tue, 09 Oct 2018 05:07:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539086848; cv=none; d=google.com; s=arc-20160816; b=oge6Fea7qdVy8pIcHCzoKZnhCAsr7gUoBxO1xXcKlSvbMcbWDHSS9kz05x0I7WU3uf PzVwvYvHe5qlpaoa4mLtHmn+k1ztw5iiEJ6bcl3teMzUPmEi2h9yOzuQCc4kAEGsa3qH nQswyVBLgyeKjuPoBbJQ6hwUyljmDUoZ64a/fflfeYhpAibJ5jTeVZRY+hLcPSUSsELF Wzw4/hPAj55A+tJSKDVyZo5LjjGy32iI5CjZ8zzVI/0iS9HRIysW115qVFLjmWXFP5sL DjtHVU47knUIxxKK1o2c9mzz4ug+hFv75wNbihyML9P3vV5brJUa6RyJ/EpmVXlTsD0h fKsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=M//P0KOH1Ru5F877TbH5CoRXYOizqnDbGJrYcTG6Coc=; b=S2f5B0qba9LA2vV01d6c772H5V5KL28l1tLvwsoFGtuFzVe1J8bhPleM6UHC9/JV0c cbDeqbPwEpPw25nou7RJDikMMz0A/afLoV4xTO/gkfH/UJNgdt0wHMVhD21W3O97e1EE c3Iob0Z1RhFhAjlXHF81I56zOkUzzKhPgeznf2vI5o820a18Emtgu9i4/yc3VCpm4DOr 1ZxjIcfFuMuXaat467S6T8mdFe61+Oqqt3kZ4u23dAdJq94yGaLVn94fP3Qt4cPmT3yb JAZYXR3tuXEj5+EKyCpNcK8Zv+nuaDA3ae03uDovKAG9ewsyF1s6y0eluNVDHO8z3+Qx 0Qtg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ob-encoder-com.20150623.gappssmtp.com header.s=20150623 header.b=CTXTHLIK; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a66-v6si10085420wmh.121.2018.10.09.05.07.27; Tue, 09 Oct 2018 05:07:28 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ob-encoder-com.20150623.gappssmtp.com header.s=20150623 header.b=CTXTHLIK; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B3AB668A066; Tue, 9 Oct 2018 15:07:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C61A76899E9 for ; Tue, 9 Oct 2018 15:06:57 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id y11-v6so1545798wrd.4 for ; Tue, 09 Oct 2018 05:07:19 -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=QVEnkKvyBMRyEiwvFr7yQHT+1J1wCIHQciyG6yqtEHM=; b=CTXTHLIKLuV8OdhC3JewN2/YrFEYEgTcdK9jFwbS8quLuu4HCVlZdkTbKcgPEaE9uC 5AG1HjtUbxBc6u4BMFIMNmimIJX+vOaQTWAn/1yC8sRi5Ae+R5K8Ag8o4O/4li5QPFSZ IDbvLEczHrNeRiuyLmzb1hTa5gOH+lnJ3KWV9Ar7Aiqhtn7rvd2FEY7Ox71ZqX36myDd MyyYRZVPvD7j/XKQv3ONazcgCFFvu35FgNTtLJ/l7bLvwrTE9ozBwqWagHHsN/A2x1+h GY7852w5aaBzl9z1Cci0suamsOWBKDEpuQB1ngxFVCF11wJ3WhoHwvWPsPqCQa9aw8j/ gnaw== 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=QVEnkKvyBMRyEiwvFr7yQHT+1J1wCIHQciyG6yqtEHM=; b=RIaH9z3euWHX5Z8UgqxBnliMpf7QE++T/t2DwdUzq22D+3gHU4jQkbJTsIQ/j6Qj9s WEGRpgnnvB5BCKJmN6XVMLEm26PuYSydl9YquyfUlu2A9t3MDChgFfqkYev93ZpYu04Q EW2XhsIhj6oAOrlbc1XRgK5vUmkZYfZyhmql1lgKWP3+C8qVIIQifUgv4VIrt/0fxYYi y2kqoGBAMT3uFQdv9CIly9BhJWbSVdanTP2JzEBUxWKRhRwoEKnSJI/tQPy3hYhXeWdq GLGd4RPmNrxhDVxA5diY+pISG+214cXIeM9cVx9573sT+9y/M1Xc7Qc8MrpIsCZ0NIHW 8Qjg== X-Gm-Message-State: ABuFfoiIgd7Prk96Dyo4E4G67lBefiZOTRzWWS54Q6wa257r7KwXxy/J P51fXf2tAJSXzSshIH7fIOe1bxsZVlI= X-Received: by 2002:adf:e48e:: with SMTP id i14-v6mr19915699wrm.145.1539086838255; Tue, 09 Oct 2018 05:07:18 -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 x185-v6sm10304222wmg.12.2018.10.09.05.07.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 09 Oct 2018 05:07:17 -0700 (PDT) From: joshdk@ob-encoder.com X-Google-Original-From: joshdk@obe.tv To: ffmpeg-devel@ffmpeg.org Date: Tue, 9 Oct 2018 13:07:15 +0100 Message-Id: <20181009120715.27917-1-joshdk@obe.tv> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: Subject: [FFmpeg-devel] [PATCH v3] 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 --- Tested with `./configure --cc='cc -m32'` now, seems to be fine. Will send sample to Michael on IRC. tests/api/Makefile | 1 + tests/api/api-h264-slice-test.c | 212 ++++++++++++++++++++++ tests/fate/api.mak | 4 + tests/ref/fate/api-h264-slice | 309 ++++++++++++++++++++++++++++++++ 4 files changed, 526 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..114561f3aa --- /dev/null +++ b/tests/api/api-h264-slice-test.c @@ -0,0 +1,212 @@ +/* + * 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 +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +static int header = 0; +static FILE *ofd; + +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; + int fd = 0; + 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(0); + } + + if (!(threads = strtoul(argv[1], NULL, 0))) + threads = 1; + else if (threads > MAX_SLICES) + threads = MAX_SLICES; + + if ((ofd = fopen(argv[3], "w")) < 0) { + perror("open out"); + exit(1); + } + + 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 (c->active_thread_type != FF_THREAD_SLICE) { + fprintf(stderr, "Couldn't activate slice threading: %d\n", c->active_thread_type); + exit(1); + } + + if (!(frame = av_frame_alloc())) { + fprintf(stderr, "Could not allocate video frame\n"); + exit(1); + } + + if ((fd = open(argv[2], O_RDONLY)) < 0) { + fprintf(stderr, "Couldn't open NALU file: %s\n", argv[2]); + exit(1); + } + + while(1) { + uint16_t size = 0; + ssize_t ret = read(fd, &size, sizeof(uint16_t)); + if (ret < 0) { + perror("Couldn't read size"); + exit(1); + } else if (ret != sizeof(uint16_t)) + break; + + ret = read(fd, p, size); + if (ret < 0 || ret != size) { + perror("Couldn't read size"); + 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); + + close(fd); + fclose(ofd); + 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