应用开发实战手写算式计算器niversallatform

首先,我们可以尝试一下多个字符同时出现这类情形中最基本的特例,即一次出现两个数字的情况。请启动手写数字识别博客中构建的应用,并在现有的应用里一次写下两个数字,看看识别效果(为了更方便书写及展示效果,我们将前一示例中笔画的宽度由40调整为20。可以体验出这一改动对单个数字的识别并无大的影响):

上图是一次试验的结果。进行多次试验,我们看到现有应用对两个数字的识别效果不尽人意。

这两点的综合结果就是,在写下多个数字的情况下,我们实际上在“强行”让AI模型做超出其适应性范围的推理。这属于AI模型的误用。其结果自然难以令人满意。

那么,为了增强应用的可用性,我们能不能改善这款应用,让其能处理常见的数学表达式呢?这要求我们的应用既能识别数字和符号,又能识别同时出现的多个字符:首先对于多个数字这种情况,我们很自然地想到,既然MNIST模型已经能很好地识别单个数字,那我们只需要把多个数字分开,一个一个地让MNIST模型进行识别就好了;对于识别其他数学符号,我们可以尝试通过扩展MNIST模型的识别范围,也即扩展MNIST数据集来实现。两者合二为一,就是一种非常可行的解决方案。这样,我们就引入了两个新的子问题,即“扩充MNIST数据集”和“多个手写字符的分割”。

结合上文陈述的问题和潜在的解决方案,本文将以“识别并计算简单的数学表达式”这一问题为导向,对现有的手写数字识别应用进行扩展。

我们的目标是对克服现存的只能对单个数字进行识别这一局限,让新应用可以识别数字、加减乘除和括号这些能构成简单数学表达式的元素,并对识别出的数学表达式进行计算。本文希望通过这些,能最终获得一款更具现实意义的人工智能应用。

最终的应用效果如下图:

注意

“识别可能出现的多种字符”和“识别同时出现的多个字符”是完全不同的,请注意区别。

小提示

我们仍可以使用支持这种压缩格式的工具将其解压。并使用二进制工具查看其内容。

注意

但是无论视觉上的颜色是什么,我们真正要遵守的规则是将前景的值转换到255,背景的值转换到0(在输入模型时,分别表现为0.5和-0.5)。

根据上述的输入格式,我们已经可以确定我们扩展训练数据的方向了。这里我们需要注意,这些格式是最终输入到卷积神经网络的数据必须满足的,而非我们即将搜集、准备的新数据。虽然这表明了我们新搜集的数据不一定要精确地满足这些条件,这些输入格式仍然对我们的数据搜集起到重要的指导作用。

下图是按照一般的像素值-视觉颜色对应关系,将MNIST中的数据、UI上绘制的数据、作为模型输入的数据三者可视化之后的示意图。图上还标记了像素值到输入数据格式中32位浮点数的映射方式(上方的橙色箭头),以便形象地展示这一转换过程(F表示 Foreground 即前景,B表示 Background 即背景):

UI上绘制的数据的格式,同时也是我们下文中要准备的新数据的格式。之所以使用和MNIST内部数据相反的形式,是为了在界面和其他地方进行可视化展示时,更符合一般的书写习惯。之后我们可以在进行训练之前,再进行反色操作,如同我们上一课处理从界面上来的位图数据一样。

搜集数据的方式多种多样。就本文的需要来说,我们可以在网络上搜索已有的数据集,可以自行开发小型应用以在触摸屏甚至手机上搜集手写图形,或者扫描手写文档并通过图像分割的方式提取运算符。并且,在搜集完原始数据之后,我们还可以通过缩放、扭曲、添加噪点等方式来扩展、增强我们的数据集,以获得更广泛的适应性。

在我们搜集足够多的新图片后(考虑到原始MNIST数据集共70000张图片,我们搜集40000张左右比较合适,虽然数量不是绝对的),我们还需要对其进行一定的格式化,以方便我们最终将其作为神经网络的输入。

位图部分所需的处理非常直观。我们可以参考前一篇手写数字识别博客中对应用图形界面上捕获的手写图形的处理方式,将搜集的图片(可能具有RGB通道)转换成28x28像素的、单通道的灰度图片,并且前景色(即笔画)色值为0(黑色),背景色色值为255(白色)。符合要求的位图样例如下:

此处更需要注意的是对图片标记的处理。在原始MNIST数据集中我们看到整数0-9被用来标记对应的图形,这是非常自然的做法。因为我们此处要解决的是多分类问题,解决这类问题的一个先决条件就是我们必须为每个分类提供一一对应的标记。我们很容易就想到用诸如10、11、12来标记加号、减号、乘号等图形类别。这是可行的。

此处我们不由得思考,延续已被占用的自然数取标记新类别,虽然可行,但让对应关系变得混乱了。10和加号、11和减号之间,并不像0-9的整数和图形之间有那么自然的联系。作为开发者的我们不禁想到,能否用ASCII表里加减乘除的字符对应的数值来做标记呢(如加号对应53,减号对应55)?这种标记的设定方法实际上是很难使用的,特别是本文中出现的MNIST训练程序基于的是TensorFlow框架,框架本身要求了标记占用的整数值必须小于类别总数。在保证标记和类别一一对应的前提条件下,我们接着已有0-9标记,再为我们新搜集的图形类别增加标记。此时我们需要清楚的定义标记到类别的对应关系,以便我们正确处理模型的输入和输出。

我们用10-15分别表示加号、减号、乘号、除号、正括号、反括号。并且,为了便于训练,我们要求这六种数学符号对应的位图,分别放置于add、minus、mul、div、lp、rp这六个文件夹中,并且这六个文件夹需要在同一个目录下。如下图所示:

我们已将应用的主体代码和训练新模型所需的代码上传到 GitHub,可以通过下面的命令将这些代码克隆到本地:

这一仓库包含两部分内容:

上文中,我们要求新搜集的数据最后需要被格式化为以色值0(黑色)为前景色,以色值255(白色)为前景色的单通道位图。我们修改后的训练脚本会读取这些位图并其反色,以到达和原始MNIST数据同样的效果(也和我们应用中输入处理的部分一致)。假设我们存放add、minus等六个文件夹的目录是D:\extension_images,我们就可以在克隆好了的仓库的/training目录下,通过命令行执行:

来启动针对包含了六种数学符号的扩展数据集的训练。该训练脚本在导入原始MNIST数据之后,还会从D:\extension_images目录分别读取六种新类别的数据。再混合新旧数据之后进行训练。可能的训练结果如下图:

小提示

混合新旧数据在这里非常有用。因为训练过程中,目前的脚本是一次仅将一部分数据用于迭代优化和模型参数更新。如果不进行混合,就会发生新数据迟迟不被利用的情况,影响模型的训练结果。

我们对MNIST模型的训练是基于卷积神经网络的。并且上本中的脚本在处理扩展的符号位图之外,并没有对用于训练原始MNIST模型的卷积神经网络的结构进行修改。我们知道系统的结构决定其功能,那么我们针对原始MNIST数据设计的网络结构能否支撑扩展后的数据集呢?对这一问题最简单的回答就是进行一次训练并观察模型性能。

用这种方法进行试验后,我们通过错误率(主要是Validation error,在此例中反映了每100次小批量训练之后,模型当前在整个验证集上的错误率;和Test error,在此例中反映了训练结束后模型在整个测试集上的错误率)发现新模型的性能还是不错的。足以支持我们接下来的应用。

如上文所述,我们为了对多个同时出现的字符进行识别,还必须解决一个子问题,那就是要对这些同时出现的字符进行分割。

我们注意到本文介绍的应用有一个特点,那就是最终用作输入的图形,是用户当场写下的,而非通过图片文件导入的静态图片。也就是说,我们拥有笔画产生过程中的全部动态信息,比如笔画的先后顺序,笔画的重叠关系等等。而且我们期望这些笔画基本都是横向书写的。考虑到这些信息,我们可以设计一种基本的分割规则:在水平面上的投影相重叠的笔画,我们就认为它们同属于一个数字。

笔画和水平方向上投影的关系示意如下图:

因此书写时,就要求不同的数字之间尽量隔开。当然为了尽可能处理不经意的重叠,我们还可以为重叠部分相对每一笔画的位置设定一个阈值,如至少进入笔画一端的10%以内。

加入对重叠的容忍阈值后,对笔画的分割的结果可以参看下图。在分割后被认为是属于同一字符的笔画我们使用了相同的颜色绘制,并且用不同的颜色区分了不属于同一字符的笔画。在字符的上方,我们用一系列水平方向的半透明色块表现了每一笔画在水平方向上的的有效重叠区域和字符之间的重叠关系。

应用这样的规则后,我们就能简便而又有效地对多个笔画进行分割,并能利用Visual Studio Tools for AI提供的批量推理功能,一次性对所有分割出的图形做推理。

在上文中克隆的 mnist_extenstion 仓库中已经存在该应用的主体应用代码了。本文将只通过引用模型来完成本文中这款应用。之后会对主要的代码进行分析。

新的Inference模型项目和模型包装类配置如下图:

在新应用的代码部分,和我们在手写数字识别博客中介绍的代码比起来,差别最大的地方就在于如何处理输入。在上个案例中,我们只需要简单地将正方形区域中的图像格式调整一下,即可用作MNIST模型的输入。而在本文的案例中,我们必须先对笔画进行分割处理。分割笔画之后我们再将每一个笔画组合转换成MNIST模型所需的单个输入。

首先我们为窗体类新增一个List<Point>类型的字段,用于记录每次鼠标按下、抬起之间鼠标移动过的点,将这些点按顺序连接起来就形成了一道笔画。我们在鼠标按下事件里清空以前记录的所有鼠标移动点,以便记录这次书写产生的新一动点;并在鼠标抬起事件里将这些点转换成笔画对应的数据结构StrokeRecord(定义见后文)。同样的,我们也为窗体类新增一个List<StrokeRecord>类型的字段,用于记录已经写下的所有笔画。

在writeArea_MouseDown方法中新增以下语句用于清空以前记录的鼠标移动点:

并在writeArea_MouseMove方法中记录鼠标这次移动所到达的点:

包括构造函数在内的StrokeRecord结构定义如下:

在将新产生的笔画添加到所有笔画的列表中之后,我们就有了当前用户写下的所有笔画了,接下来我们要对这些笔画进行分组。

本文在这里对上文所述的“快速”分割的实现非常简单。在按笔画在水平方向上最左端的坐标,将笔画有小到大排序后,我们从最左边开始扫描所有笔画。如果一个笔画还没有分组,我们就为它指定唯一分组编号,然后再看其右侧有哪些笔画和当前笔画在水平方向上的投影是有效重合的(如上文所述,此处有阈值10%),并将这些重合的笔画定为属于同一组。直到所有笔画都被扫描。

之后即可按对应的分组编号将笔画归组:

小提示

为了方便理解笔画的分割效果,应用界面上预留了“显示笔画分组”的开关。勾选之后写下的笔画会像上文那样被不同的颜色标记出其所在的分组。

分割完成后,我们得到了一个数组groups,它的每个元素都是一个分组,包括了分组编号和组内的所有笔画。这里我们得到的每一个分组都对应着一个字符。如果分组里有多个笔画,那么这些笔画就是这个字符的组成部分(想象加号和乘号,它们都需要两笔才能写成)。我们可以想到,这个数组groups里的元素的顺序是很重要的,因为我们要保证最终识别出的表达式里的字符的顺序,才能正确地计算表达式。

我们在循环中顺序访问groups的每个元素。命名循环变量为group:

循环变量group的类型是IGrouping<int, StrokeRecord>,它代表着一个分组,包括分组的编号(一个整数)和其中的元素(元素都是StrokeRecord)。IGrouping<TKey, TElement>泛型接口同时也是一个可迭代的IEnumerable<TElement>泛型接口,所以我们可以把group变量直接当做IEnumerable<StrokeRecord>类型的对象来使用。

然后我们需要确定这个分组(即其中所有笔画组合成的图形)的位置区域,其中我们最关心水平方向上最左端、最右端的坐标(水平方向的坐标轴是从左向右的)。

通过这两个坐标我们就能确定该分组在水平方向上的投影的长度。我们计算这个长度的目的,是为了在我们为每个分组生成单一位图时,尽量将这个分组的图形放置在单一位图的中间位置。虽然我们还是先创建一个大尺寸的正方形位图(边长为绘图区高度),但是分割后的图形在这个正方形区域上不再具有天然的位置。下面的代码进行了这些位置的计算,和居中该分组所需的水平方向的偏移量的计算:

之后我们就在新创建出的位图上绘制当前分组内的笔画了(通过canvasGraphics对象进行绘制):

不过我们现在已经准备好了多组数据,这使得我们有机会利用底层AI框架的并行处理能力,来加速我们的推理过程,还省去了手动处理多线程的麻烦。在这里我们采用Visual Studio Tools for AI提供的批量推理功能,一次对所有数据进行推理并得到全部结果。

首先我们在为所得分组创建位图之前,需要先创建一个用于储存所有数据的动态数组:

在处理所有分组的循环内部,处理完每个分组后,我们需要将该分组对应的像素数据暂时存放在动态数组batchInferInput中:

可以看到我们对每个分组的处理,都和以前对整个正方形绘图区的像素的处理,是完全一致的。唯一的不同是在以前的应用代码中,List<IEnumerable<float>>类型的数组(在上文中为batchInferInput变量)仅有一个元素,就是唯一一张位图的像素数据。而在本文中这个数组可能有很多元素,每个元素都是一组位图数据。对这样的位图数据集合进行批量推理后,得到的结果(即inferResult变量)是一个可枚举的类型,我们叫它“第一层枚举”。第一层枚举得到的每个元素也是一个可枚举类型,我们叫它“第二层枚举”。

进行推理的代码如下:

至此,我们对于多个手写字符的识别就完成了。我们已经得到了可以表示用户手写图形的、易于计算机程序处理的字符串。接下来我们开始对字符串记载的数学表达式进行计算。

本文需要计算的数学表达式的格式,由上文的数据准备和模型训练部分可知,是相对简单的。其中只涉及数字0-9、加减乘除和小括号。对这样的表达式进行求值,是一种非常典型的问题。因为这样的数学表达式有非常清晰、确定的语法规则,对其最直观的处理方法,就是先根据其语法进行解析,构造语法树后进行求值即可。或者,因为这种问题非常经典,我们也可以寻找已有的组件来解决这个问题。

因为表达式的计算这部分逻辑边界非常清晰,我们引入一个独立的方法来获取最后的结果:

EvaluateAndFormatExpression方法接受一个标签序列,其中我们仍在用整数10-15来表示各种数学符号。在这个方法内我们对字符标签做两种映射,分别将标签序列转换成用于输入到计算器进行求值的,和用于在用户界面上展示的。EvaluateAndFormatExpression方法的返回结果形如“(3+2)÷2=2.5”。其中各种符号皆采用传统的数学写法。该方法的实现如下:

同时需要注意的是,根据表达式求值方案的不同,我们可能需要对表达式中的字符进行对应的调整。比如当我们希望在用户界面上将除号显示为更可读的“÷”时,我们采用的求值方案可能并不支持这种除号,而只支持C#语言中的除号/。那么我们在将识别出的结果输入到表达式计算器中之前,还需要对识别的结果进行合适的映射。

这是一种非常容易出现的情况。因为在手写时,正反小括号和数字1极易混淆。这一问题有时会在扩展数据中体现。我们观察到原始MNIST数据集中(参见上文的数据可视化),很多数字1的形状和弯曲程度已经和括号相近。如果我们在扩展数据部分不做明显的区分,并且我们采用的卷积神经网络对这样微小的数据差别不敏感的话,就会导致造型相近的字符被错误识别的情况。

同理,这样的问题还可能发生在加号和乘号之间。因为加号和乘号的形状基本完全一样,只是靠角度得以区分。如果我们搜集的扩展数据里,这两种符号各自都具有一定的旋转角度,以致角度区分不够明显,这也会导致模型对其识别能力不强的情况出现。

经过一番扩展,我们的新应用已经具备一些不错的功能,初步满足了现实规格的应用需求。从本文的案例中,我们也能得到关于如何将人工智能和传统的技术手段融合起来,帮助我们更好地解决问题的一些启示。当然,这款新应用仍然不够强大和健壮。对此,我们注意到有这样一些问题仍待解决:

THE END
0.读十堂极简人工智能课笔记01人工智能简史12.1.2. 第一场专注这个领域的研讨会,探讨(并且命名)了人工智能 13. 1956~1959年 13.1. 沃尔特·皮茨和沃伦·麦卡洛开发了最初的神经网络之一 13.2. 马文·明斯基设计了SNARC 13.2.1. 随机神经模拟强化计算器 13.2.2. 这是一台神经网络机器 14. 到了1964年 jvzquC41yy}/lrfpuj{/exr1r1gg5:i2;;7fcj
1.人工智能计算器去广告破解版下载人工智能计算器AI Calculator这款手机上必备的计算工具相比于传统的计算器,最大的特点就是支持手势的操作。虽然正式版的需要收费,但今天小编给大家带来的是人工智能计算器去广告破解VIP版,需要的朋友赶快来下载吧! 软件介绍 人工智能计算器AI Calculator是一款接口简洁、功能强大、多点触控、支持运算式、支持单位转换和即jvzquC41yy}/h}|0eun1juqhz039;2;84ivvq
2.昌平人工智能政策计算器为企业“秒算钱”昌平人工智能政策计算器为企业“秒算钱”_北京时间 8月5日,昌平2025年优化营商环境大会举办,来自昌平区150多家企业参会。 8月5日,昌平2025年优化营商环境大会举办,来自昌平区150多家企业参会。 8月5日,昌平2025年优化营商环境大会举办,来自昌平区150多家企业参会。 8月5日,昌平2025年优化营商环境大会举办,jvzquC41kvkn0kykog4dqv466wt:h=
3.计算管家破解版人工智能计算器下载v4.3.1安卓解锁版4. 适当的付费有助于作者后续持续改进,作者也为之付出了持续数年的心血,真心希望大家能够理解。 总的来说,付费版功能更加强大,用就是了! 计算管家更新说明:2020-11-22 V4.3.1 1、原人工智能计算器自v3.4版开始更名为计算管家。 2、[改进]修改隐私政策说明。 精选应用 谷歌chrome浏览器2023安卓最新jvzq<84yyy4lm3pgv5b|8<5364ivvq
4.Quoai–技术项目报价智能计算器–AICMTY智能项目报价计算器,为自由职业者和技术机构提供详细报价生成。 Quoai官网链接地址:https://quoai.fr 网站默认显示语言:法语 Quoai 介绍 Quoai是一款智能报价计算器,利用人工智能快速生成详细报价,帮助用户优化报价和利润。产品提供详细的报价模板、智能计算器、团队管理、费用跟踪等功能。 jvzquC41yy}/crhov{4dqv43;9?957mvon
5.ideacalc.comSee relevant content for ideacalc.comjvzq<84yyy4jfnfecni/exr1
6.语音人工智能计算器官方下载没有对应的IOS版,点击下载的是:语音人工智能计算器最新版安卓版内容介绍相关下载评论0 语音人工智能计算器安卓版用户好评如潮,内置简约的计算界面,ui设计大气清晰,不管是成人还是儿童,都能很好的通过它来计算,支持真人语音播报,告别传统的机械声音! 语音人工智能计算器官方简介 语音人工计算器是一款多功能计算器,附带jvzquC41yy}/fjslk3610lto1cvq1:977:=/j}rn
7.人工智能计算器AICalculator3.3.0详细破解思路&教程【文章标题】:人工智能计算器AI Calculator 3.3.0 详细破解思路&教程 【文章作者】: Ericky 【作者jvzquC41yy}/7;uqlkk/ew4vjtkbf68:5681/:230jznn
8.智能语音计算器应用设计1. 语音计算器概述 随着人工智能技术的不断进步,语音计算器作为智能化应用的一个分支,已经走进了我们的工作与生活。语音计算器不仅仅是一个简单的计算工具,它融合了语音识别、语音合成、自然语言处理等多项前沿技术,为用户提供了一个全新的交互方式。本章节将从语音计算器的基本概念开始,简要介绍其工作原理及市场现状jvzquC41dnuh0lxfp0tfv8|gkzooa<;45:?948ftvkimg8igvcomu86723:22A9
9.语音人工智能计算器安卓版下载计算器,计算机,年龄计算器,语音备忘录,语音包,大数运算,语音计算器,分数计算器,人工智能计算器,房贷计算器,新版计算器,口袋计算器,科学计算器,个税计算器,工资计算器 语音人工计算器是一款多功能计算器,附带有声功能, 按键时语音报数,真人语音报告结果。记录历史计算算式,清晰明了,方便记账。华军软件园提供语音人工jvzq<84yyy4ppunpgfuxp7sgv1yph}4323783=:0jvs
10.智能计算器全能计算工具算算式,清晰明了,方便记账。特点: 自动记录计算算式以方便查找插入备注或分段,方便记账,计算财务真人超速语音播放按键数字,报告计算结果高清计算器,良好的支持ipad,是ipad计算机首选 - 提供多种提示音,随意切换声音内置多套高清皮肤,选择你的个性样式体积小,不jvzquC41crvt0jurng4dqv4ep1gqr8*G8'?:'KF'G:+95.GF'G>&CN*C3'K8'JJ';9+F7.>;'C>.'N:':7+B:.J:':9&DM*G:'GF'J6'G9+BG.>9'G;&D@*C7'K6'A:'D95jf:9:57>74A6Augk.cuq?ewyuqvjtu/gmux2dqwmiv6frru
11.中科曙光~拥有自主人工智能芯片的计算器龙玉树芝兰的杰瑞德 2023-03-07 16:25 中科曙光~拥有自主人工智能芯片的计算器龙头股!30元附近准备重新买入。全部评论0 打开APP查看更多评论 热门股吧 1 比亚迪 SZ002594 97.20 -0.33% 740讨论 2 闻泰科技 SH600745 45.00 9.70% 687讨论 3 特变电工 SH600089 26.50 4.17% 591讨论 4 工业富联 SHjvzquC41iwhb0|npc0io1ngya772>8a49:88?3jvor
12.计算机下棋的思考模式:特征识别和预测分析人工智能弈棋计算机深蓝另外值得注意的是,在上述局面静态评估的构建过程中,机器作为一个“智能个体”,最多参与到特征的“权重”设定,而对于更重要的“应该使用什么样的特征”以及“根据什么方式对所有特征进行整合”的问题则完全由人类专家负责。可以说,“特征自动提取”一直是机器学习这个人工智能分支多年来的主要挑战之一。后面还会再次提到jvzquC41vgii0|npc0ipo7hp1f532:9/2933:8624;?649>79a8/uqyon
13.【计算管家电脑版下载2025】计算管家PC端最新版「含模拟器」计算管家,一般又称人工智能计算器语音版,AI Calculator。一款界面简洁、功能强大、支持表达式、支持单位转换和即时汇率换算的多行文本计算器。 人工智能计算器(AI Calculator)是一款界面简洁、功能强大、支持表达式、支持单位转换和即时汇率换算的多行文本计算器。 软件特点: 1. 界面简洁、功能强大 2. 支持复杂计算表达式jvzquC41yy}/nrvwep4dqv4re1=62@>0ujznn
14.人工智能技术的基础(精选5篇)对比传统的矿山自动化控制器,计算器人工智能技术能够在较短的时间内建立自动化模型,对于参数的变化,其他相关联数值能够迅速被更新,有效提升了自动化控制水平,为电气自动化的发展提供了较高的促进作用。(4)操作简便。计算机技术的发展促进了信息处理与数理处理的速度,能够降低操作的难度使得普通的工作人员在工作过程中jvzquC41yy}/3vnujw4dqv4jcq}fp88545<:0qyon
15.从蜘蛛侠同款杀手锏到离子计算器,西湖大学材料科学与工程分支挑战我们的研究,利用材料理论、计算机模拟,再结合人工智能的方式去开发新材料。当我们把计算机模拟和人工智能结合起来,就可以高效地在巨大的材料参数空间里,寻找更好的材料性能,从而达到加速材料研发、降低研发成本的目的。 眼下,我们主要关注硫系功能材料和低维半导体材料中的新奇物性与多场耦合效应、相转变,以及电学输运性质jvzquC41yy}/ynxvncqf0niw0et0pn|uag|fp}x1ygyunjpgpg}t1^skxgxtk}~Pgyy04973285u49732862a:559;4tj}rn
16.不懂代码也能做计算器?Manus帮你你一键生成专属神器打开Manus的万能计算器,只要你有个想法,它就能帮你“凭空”变出一个计算器。听起来是不是有点玄乎?别急,我们一起来看看它到底是怎么做到的。 简单来说,万能计算器是一个能让你零门槛、零代码创建专属计算器的在线工具。 你不需要关心背后的数学公式是怎么写的,也不需要设计复杂的界面。你要做的,仅仅是把你的jvzquC41yy}/rltpnktf0lto0et0cr43;5=03B8967;30qyon