CrackMe.apk
Download file
package com.google.android.exoplayer2.text.ttml;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.SpannableStringBuilder;
import android.util.Base64;
import android.util.Pair;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.text.Cue;
import com.google.android.exoplayer2.util.Assertions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
final class TtmlNode {
public static final String ANNOTATION_POSITION_AFTER = "after";
public static final String ANNOTATION_POSITION_BEFORE = "before";
public static final String ANNOTATION_POSITION_OUTSIDE = "outside";
public static final String ANONYMOUS_REGION_ID = "";
public static final String ATTR_EBUTTS_MULTI_ROW_ALIGN = "multiRowAlign";
public static final String ATTR_ID = "id";
public static final String ATTR_TTS_BACKGROUND_COLOR = "backgroundColor";
public static final String ATTR_TTS_COLOR = "color";
public static final String ATTR_TTS_DISPLAY_ALIGN = "displayAlign";
public static final String ATTR_TTS_EXTENT = "extent";
public static final String ATTR_TTS_FONT_FAMILY = "fontFamily";
public static final String ATTR_TTS_FONT_SIZE = "fontSize";
public static final String ATTR_TTS_FONT_STYLE = "fontStyle";
public static final String ATTR_TTS_FONT_WEIGHT = "fontWeight";
public static final String ATTR_TTS_ORIGIN = "origin";
public static final String ATTR_TTS_RUBY = "ruby";
public static final String ATTR_TTS_RUBY_POSITION = "rubyPosition";
public static final String ATTR_TTS_SHEAR = "shear";
public static final String ATTR_TTS_TEXT_ALIGN = "textAlign";
public static final String ATTR_TTS_TEXT_COMBINE = "textCombine";
public static final String ATTR_TTS_TEXT_DECORATION = "textDecoration";
public static final String ATTR_TTS_TEXT_EMPHASIS = "textEmphasis";
public static final String ATTR_TTS_WRITING_MODE = "writingMode";
public static final String BOLD = "bold";
public static final String CENTER = "center";
public static final String COMBINE_ALL = "all";
public static final String COMBINE_NONE = "none";
public static final String END = "end";
public static final String ITALIC = "italic";
public static final String LEFT = "left";
public static final String LINETHROUGH = "linethrough";
public static final String NO_LINETHROUGH = "nolinethrough";
public static final String NO_UNDERLINE = "nounderline";
public static final String RIGHT = "right";
public static final String RUBY_BASE = "base";
public static final String RUBY_BASE_CONTAINER = "baseContainer";
public static final String RUBY_CONTAINER = "container";
public static final String RUBY_DELIMITER = "delimiter";
public static final String RUBY_TEXT = "text";
public static final String RUBY_TEXT_CONTAINER = "textContainer";
public static final String START = "start";
public static final String TAG_BODY = "body";
public static final String TAG_BR = "br";
public static final String TAG_DATA = "data";
public static final String TAG_DIV = "div";
public static final String TAG_HEAD = "head";
public static final String TAG_IMAGE = "image";
public static final String TAG_INFORMATION = "information";
public static final String TAG_LAYOUT = "layout";
public static final String TAG_METADATA = "metadata";
public static final String TAG_P = "p";
public static final String TAG_REGION = "region";
public static final String TAG_SPAN = "span";
public static final String TAG_STYLE = "style";
public static final String TAG_STYLING = "styling";
public static final String TAG_TT = "tt";
public static final String TEXT_EMPHASIS_AUTO = "auto";
public static final String TEXT_EMPHASIS_MARK_CIRCLE = "circle";
public static final String TEXT_EMPHASIS_MARK_DOT = "dot";
public static final String TEXT_EMPHASIS_MARK_FILLED = "filled";
public static final String TEXT_EMPHASIS_MARK_OPEN = "open";
public static final String TEXT_EMPHASIS_MARK_SESAME = "sesame";
public static final String TEXT_EMPHASIS_NONE = "none";
public static final String UNDERLINE = "underline";
public static final String VERTICAL = "tb";
public static final String VERTICAL_LR = "tblr";
public static final String VERTICAL_RL = "tbrl";
private List<TtmlNode> children;
public final long endTimeUs;
public final String imageId;
public final boolean isTextNode;
private final HashMap<String, Integer> nodeEndsByRegion;
private final HashMap<String, Integer> nodeStartsByRegion;
public final TtmlNode parent;
public final String regionId;
public final long startTimeUs;
public final TtmlStyle style;
private final String[] styleIds;
public final String tag;
public final String text;
public static TtmlNode buildTextNode(String str) {
return new TtmlNode((String) null, TtmlRenderUtil.applyTextElementSpacePolicy(str), C.TIME_UNSET, C.TIME_UNSET, (TtmlStyle) null, (String[]) null, "", (String) null, (TtmlNode) null);
}
public static TtmlNode buildNode(String str, long j, long j2, TtmlStyle ttmlStyle, String[] strArr, String str2, String str3, TtmlNode ttmlNode) {
return new TtmlNode(str, (String) null, j, j2, ttmlStyle, strArr, str2, str3, ttmlNode);
}
private TtmlNode(String str, String str2, long j, long j2, TtmlStyle ttmlStyle, String[] strArr, String str3, String str4, TtmlNode ttmlNode) {
this.tag = str;
this.text = str2;
this.imageId = str4;
this.style = ttmlStyle;
this.styleIds = strArr;
this.isTextNode = str2 != null;
this.startTimeUs = j;
this.endTimeUs = j2;
this.regionId = (String) Assertions.checkNotNull(str3);
this.parent = ttmlNode;
this.nodeStartsByRegion = new HashMap<>();
this.nodeEndsByRegion = new HashMap<>();
}
public boolean isActive(long j) {
long j2 = this.startTimeUs;
return (j2 == C.TIME_UNSET && this.endTimeUs == C.TIME_UNSET) || (j2 <= j && this.endTimeUs == C.TIME_UNSET) || ((j2 == C.TIME_UNSET && j < this.endTimeUs) || (j2 <= j && j < this.endTimeUs));
}
public void addChild(TtmlNode ttmlNode) {
if (this.children == null) {
this.children = new ArrayList();
}
this.children.add(ttmlNode);
}
public TtmlNode getChild(int i) {
List<TtmlNode> list = this.children;
if (list != null) {
return list.get(i);
}
throw new IndexOutOfBoundsException();
}
public int getChildCount() {
List<TtmlNode> list = this.children;
if (list == null) {
return 0;
}
return list.size();
}
public long[] getEventTimesUs() {
TreeSet treeSet = new TreeSet();
int i = 0;
getEventTimes(treeSet, false);
long[] jArr = new long[treeSet.size()];
Iterator it = treeSet.iterator();
while (it.hasNext()) {
jArr[i] = ((Long) it.next()).longValue();
i++;
}
return jArr;
}
private void getEventTimes(TreeSet<Long> treeSet, boolean z) {
boolean equals = "p".equals(this.tag);
boolean equals2 = TAG_DIV.equals(this.tag);
if (z || equals || (equals2 && this.imageId != null)) {
long j = this.startTimeUs;
if (j != C.TIME_UNSET) {
treeSet.add(Long.valueOf(j));
}
long j2 = this.endTimeUs;
if (j2 != C.TIME_UNSET) {
treeSet.add(Long.valueOf(j2));
}
}
if (this.children != null) {
for (int i = 0; i < this.children.size(); i++) {
this.children.get(i).getEventTimes(treeSet, z || equals);
}
}
}
public String[] getStyleIds() {
return this.styleIds;
}
public List<Cue> getCues(long j, Map<String, TtmlStyle> map, Map<String, TtmlRegion> map2, Map<String, String> map3) {
ArrayList<Pair> arrayList = new ArrayList<>();
traverseForImage(j, this.regionId, arrayList);
TreeMap treeMap = new TreeMap();
long j2 = j;
traverseForText(j2, false, this.regionId, treeMap);
traverseForStyle(j2, map, map2, this.regionId, treeMap);
ArrayList arrayList2 = new ArrayList();
for (Pair pair : arrayList) {
String str = map3.get(pair.second);
if (str != null) {
byte[] decode = Base64.decode(str, 0);
Bitmap decodeByteArray = BitmapFactory.decodeByteArray(decode, 0, decode.length);
TtmlRegion ttmlRegion = (TtmlRegion) Assertions.checkNotNull(map2.get(pair.first));
arrayList2.add(new Cue.Builder().setBitmap(decodeByteArray).setPosition(ttmlRegion.position).setPositionAnchor(0).setLine(ttmlRegion.line, 0).setLineAnchor(ttmlRegion.lineAnchor).setSize(ttmlRegion.width).setBitmapHeight(ttmlRegion.height).setVerticalType(ttmlRegion.verticalType).build());
}
}
for (Map.Entry entry : treeMap.entrySet()) {
TtmlRegion ttmlRegion2 = (TtmlRegion) Assertions.checkNotNull(map2.get(entry.getKey()));
Cue.Builder builder = (Cue.Builder) entry.getValue();
cleanUpText((SpannableStringBuilder) Assertions.checkNotNull(builder.getText()));
builder.setLine(ttmlRegion2.line, ttmlRegion2.lineType);
builder.setLineAnchor(ttmlRegion2.lineAnchor);
builder.setPosition(ttmlRegion2.position);
builder.setSize(ttmlRegion2.width);
builder.setTextSize(ttmlRegion2.textSize, ttmlRegion2.textSizeType);
builder.setVerticalType(ttmlRegion2.verticalType);
arrayList2.add(builder.build());
}
return arrayList2;
}
private void traverseForImage(long j, String str, List<Pair<String, String>> list) {
if (!"".equals(this.regionId)) {
str = this.regionId;
}
if (!isActive(j) || !TAG_DIV.equals(this.tag) || this.imageId == null) {
for (int i = 0; i < getChildCount(); i++) {
getChild(i).traverseForImage(j, str, list);
}
return;
}
list.add(new Pair(str, this.imageId));
}
private void traverseForText(long j, boolean z, String str, Map<String, Cue.Builder> map) {
this.nodeStartsByRegion.clear();
this.nodeEndsByRegion.clear();
if (!TAG_METADATA.equals(this.tag)) {
if (!"".equals(this.regionId)) {
str = this.regionId;
}
if (this.isTextNode && z) {
getRegionOutputText(str, map).append((CharSequence) Assertions.checkNotNull(this.text));
} else if (TAG_BR.equals(this.tag) && z) {
getRegionOutputText(str, map).append(10);
} else if (isActive(j)) {
for (Map.Entry next : map.entrySet()) {
this.nodeStartsByRegion.put((String) next.getKey(), Integer.valueOf(((CharSequence) Assertions.checkNotNull(((Cue.Builder) next.getValue()).getText())).length()));
}
boolean equals = "p".equals(this.tag);
for (int i = 0; i < getChildCount(); i++) {
getChild(i).traverseForText(j, z || equals, str, map);
}
if (equals) {
TtmlRenderUtil.endParagraph(getRegionOutputText(str, map));
}
for (Map.Entry next2 : map.entrySet()) {
this.nodeEndsByRegion.put((String) next2.getKey(), Integer.valueOf(((CharSequence) Assertions.checkNotNull(((Cue.Builder) next2.getValue()).getText())).length()));
}
}
}
}
private static SpannableStringBuilder getRegionOutputText(String str, Map<String, Cue.Builder> map) {
if (!map.containsKey(str)) {
Cue.Builder builder = new Cue.Builder();
builder.setText(new SpannableStringBuilder());
map.put(str, builder);
}
return (SpannableStringBuilder) Assertions.checkNotNull(map.get(str).getText());
}
private void traverseForStyle(long j, Map<String, TtmlStyle> map, Map<String, TtmlRegion> map2, String str, Map<String, Cue.Builder> map3) {
int i;
if (isActive(j)) {
String str2 = "".equals(this.regionId) ? str : this.regionId;
Iterator<Map.Entry<String, Integer>> it = this.nodeEndsByRegion.entrySet().iterator();
while (true) {
i = 0;
if (!it.hasNext()) {
break;
}
Map.Entry next = it.next();
String str3 = (String) next.getKey();
int intValue = this.nodeStartsByRegion.containsKey(str3) ? this.nodeStartsByRegion.get(str3).intValue() : 0;
int intValue2 = ((Integer) next.getValue()).intValue();
if (intValue != intValue2) {
applyStyleToOutput(map, (Cue.Builder) Assertions.checkNotNull(map3.get(str3)), intValue, intValue2, ((TtmlRegion) Assertions.checkNotNull(map2.get(str2))).verticalType);
} else {
Map<String, TtmlRegion> map4 = map2;
Map<String, Cue.Builder> map5 = map3;
}
}
Map<String, TtmlRegion> map6 = map2;
Map<String, Cue.Builder> map7 = map3;
while (i < getChildCount()) {
getChild(i).traverseForStyle(j, map, map2, str2, map3);
i++;
Map<String, TtmlRegion> map8 = map2;
}
}
}
private void applyStyleToOutput(Map<String, TtmlStyle> map, Cue.Builder builder, int i, int i2, int i3) {
TtmlStyle resolveStyle = TtmlRenderUtil.resolveStyle(this.style, this.styleIds, map);
SpannableStringBuilder spannableStringBuilder = (SpannableStringBuilder) builder.getText();
if (spannableStringBuilder == null) {
spannableStringBuilder = new SpannableStringBuilder();
builder.setText(spannableStringBuilder);
}
SpannableStringBuilder spannableStringBuilder2 = spannableStringBuilder;
if (resolveStyle != null) {
TtmlRenderUtil.applyStylesToSpan(spannableStringBuilder2, i, i2, resolveStyle, this.parent, map, i3);
if ("p".equals(this.tag)) {
if (resolveStyle.getShearPercentage() != Float.MAX_VALUE) {
builder.setShearDegrees((resolveStyle.getShearPercentage() * -90.0f) / 100.0f);
}
if (resolveStyle.getTextAlign() != null) {
builder.setTextAlignment(resolveStyle.getTextAlign());
}
if (resolveStyle.getMultiRowAlign() != null) {
builder.setMultiRowAlignment(resolveStyle.getMultiRowAlign());
}
}
}
}
private static void cleanUpText(SpannableStringBuilder spannableStringBuilder) {
for (DeleteTextSpan deleteTextSpan : (DeleteTextSpan[]) spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), DeleteTextSpan.class)) {
spannableStringBuilder.replace(spannableStringBuilder.getSpanStart(deleteTextSpan), spannableStringBuilder.getSpanEnd(deleteTextSpan), "");
}
for (int i = 0; i < spannableStringBuilder.length(); i++) {
if (spannableStringBuilder.charAt(i) == ' ') {
int i2 = i + 1;
int i3 = i2;
while (i3 < spannableStringBuilder.length() && spannableStringBuilder.charAt(i3) == ' ') {
i3++;
}
int i4 = i3 - i2;
if (i4 > 0) {
spannableStringBuilder.delete(i, i4 + i);
}
}
}
if (spannableStringBuilder.length() > 0 && spannableStringBuilder.charAt(0) == ' ') {
spannableStringBuilder.delete(0, 1);
}
for (int i5 = 0; i5 < spannableStringBuilder.length() - 1; i5++) {
if (spannableStringBuilder.charAt(i5) == 10) {
int i6 = i5 + 1;
if (spannableStringBuilder.charAt(i6) == ' ') {
spannableStringBuilder.delete(i6, i5 + 2);
}
}
}
if (spannableStringBuilder.length() > 0 && spannableStringBuilder.charAt(spannableStringBuilder.length() - 1) == ' ') {
spannableStringBuilder.delete(spannableStringBuilder.length() - 1, spannableStringBuilder.length());
}
for (int i7 = 0; i7 < spannableStringBuilder.length() - 1; i7++) {
if (spannableStringBuilder.charAt(i7) == ' ') {
int i8 = i7 + 1;
if (spannableStringBuilder.charAt(i8) == 10) {
spannableStringBuilder.delete(i7, i8);
}
}
}
if (spannableStringBuilder.length() > 0 && spannableStringBuilder.charAt(spannableStringBuilder.length() - 1) == 10) {
spannableStringBuilder.delete(spannableStringBuilder.length() - 1, spannableStringBuilder.length());
}
}
}
Download file